Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für: .NET Framework
.NET .NET
Standard
Bei einer Transaktion handelt es sich u. a. um mehrere zusammenhängende Aufgaben, die entweder in ihrer Gesamtheit erfolgreich abgeschlossen werden (Commit) oder nicht (Abort). Bei einer verteilten Transaktion handelt es sich um eine Transaktion, die sich auf verschiedene Ressourcen auswirkt. Damit ein Commit einer verteilten Transaktion erfolgreich ausgeführt werden kann, müssen alle Beteiligten gewährleisten, dass jede vorgenommene Datenänderung dauerhaft ist. Änderungen müssen auch im Fall von Systemausfällen oder anderen unvorhergesehenen Ereignissen dauerhaft sein. Sobald auch nur ein Beteiligter dies nicht gewährleisten kann, kann die gesamte Transaktion nicht ausgeführt werden, und sämtliche im Zuge der Transaktion durchgeführten Datenänderungen werden in einem Rollback zurückgenommen.
Hinweis
Informationen zu verteilten Transaktionen in Azure SQL-Datenbank und Azure SQL Managed Instance finden Sie unter Verteilte Transaktionen in Clouddatenbanken.
Arbeiten mit System.Transactions
In .NET werden verteilte Transaktionen über die API im System.Transactions-Namespace verwaltet. Die System.Transactions-API delegiert die Behandlung verteilter Transaktionen an einen Transaktionsmonitor wie den MS DTC (Microsoft Distributed Transaction Coordinator), wenn mehrere ständige Ressourcen-Manager beteiligt sind. Weitere Informationen finden Sie unter Grundlagen zu Transaktionen.
ADO.NET 2.0 führte die Unterstützung für die Einbindung in eine verteilte Transaktion mithilfe der Methode EnlistTransaction ein, die eine Verbindung in eine Transaction-Instanz einbindet. In früheren Versionen von ADO.NET wurde die explizite Anmeldung in verteilten Transaktionen mit der EnlistDistributedTransaction Methode einer Verbindung durchgeführt, um eine Verbindung in einer ITransaction Instanz zu registrieren, was für Abwärtskompatibilität unterstützt wird. Weitere Informationen zu Enterprise Services-Transaktionen finden Sie unter Interoperabilität mit Enterprise Services- und COM+-Transaktionen.
Bei Verwendung einer System.Transactions-Transaktion mit dem Microsoft SqlClient-Datenanbieter für SQL Server für eine SQL Server-Datenbank wird automatisch ein leichtgewichtiges Transaction verwendet. Die Transaktion kann anschließend bei Bedarf zu einer vollständig verteilten Transaktion heraufgestuft werden. Weitere Informationen finden Sie unter System.Transactions-Integration mit SQL Server.
Automatisches Eintragen in eine verteilte Transaktion
Die automatische Einbindung ist die standardmäßige (und bevorzugte) Methode zur Integration von ADO.NET-Verbindungen mit System.Transactions. Ein Verbindungsobjekt trägt sich automatisch in eine vorhandene verteilte Transaktion ein, wenn es feststellt, dass eine Transaktion aktiv ist. Bei System.Transaction bedeutet dies, dass Transaction.Current nicht NULL ist. Die automatische Transaktionseintragung erfolgt beim Öffnen der Verbindung. Dies erfolgt nicht anschließend, auch wenn ein Befehl innerhalb des Gültigkeitsbereichs einer Transaktion ausgeführt wird. Sie können die automatische Einbindung in bestehende Transaktionen deaktivieren, indem Sie Enlist=false als Verbindungszeichenfolgenparameter für ein SqlConnection.ConnectionString angeben.
Manuelles Anmelden bei einer verteilten Transaktion
Wenn die automatische Eintragung deaktiviert ist oder Sie eine Transaktion eintragen müssen, die nach dem Öffnen der Verbindung gestartet wurde, können Sie sie in eine vorhandene verteilte Transaktion eintragen, indem Sie die EnlistTransaction-Methode des SqlConnection-Objekts für den Microsoft SqlClient-Datenanbieter für SQL Server verwenden. Durch das Eintragen in eine vorhandene verteilte Transaktion wird sichergestellt, dass bei einem Commit oder Rollback der Transaktion auch die Änderungen einbezogen werden, die vom Code an der Datenquelle vorgenommen wurden.
Hinweis
Wenn Sie versuchen, einen Commit oder Rollback für eine Transaktion auszuführen, wenn ein DataReader gestartet wird und die Transaktion aktiv ist, wird eine Ausnahme ausgelöst.
Die Einbindung in verteilte Transaktionen ist insbesondere beim Pooling von Geschäftsobjekten sinnvoll. Wenn ein Geschäftsobjekt mit einer geöffneten Verbindung im Pool zusammengefasst ist, erfolgt die automatische Einbindung in die Transaktion nur beim Öffnen dieser Verbindung. Wenn mehrere Transaktionen mithilfe des gepoolten Geschäftsobjekts ausgeführt werden, wird die offene Verbindung für dieses Objekt nicht automatisch in neu gestartete Transaktionen eingebunden. In diesem Fall können Sie die automatische Transaktionseintragung für die Verbindung deaktivieren und die Verbindung mithilfe der EnlistTransaction-Methode in Transaktionen eintragen.
EnlistTransaction akzeptiert nur ein Argument vom Typ Transaction, das einen Verweis auf die vorhandene Transaktion darstellt. Nach dem Aufrufen der EnlistTransaction-Methode der Verbindung werden alle Änderungen, die mit der Verbindung an der Datenquelle vorgenommen wurden, in die Transaktion eingetragen. Beim Übergeben eines NULL-Werts wird die Verbindung aus der aktuellen verteilten Transaktionseintragung ausgetragen. Beachten Sie, dass die Verbindung vor dem Aufrufen der EnlistTransaction-Methode hergestellt werden muss.
Hinweis
Nachdem eine Verbindung ausdrücklich in eine Transaktion eingetragen wurde, kann sie solange nicht ausgetragen oder in eine andere Transaktion eingetragen werden, bis die erste Transaktion beendet wurde.
Achtung
Die EnlistTransaction-Methode löst eine Ausnahme aus, wenn die Verbindung bereits mithilfe ihrer BeginTransaction-Methode eine Transaktion begonnen hat. Wenn es sich bei der Transaktion jedoch um eine lokale Transaktion handelt, die an der Datenquelle begonnen wurde (z. B. die explizite Ausführung der BEGIN TRANSACTION-ANWEISUNG mithilfe eines SqlCommand), führt die EnlistTransaction-Methode einen Rollback der lokalen Transaktion durch und trägt sich selbst wie angefordert in die vorhandene verteilte Transaktion ein. Sie erhalten keine Benachrichtigung darüber, dass die lokale Transaktion zurückgesetzt wurde, und müssen alle lokalen Transaktionen verwalten, die nicht mit BeginTransaction gestartet wurden. Wenn Sie den Microsoft SqlClient-Datenanbieter für SQL Server zusammen mit SQL Server verwenden, wird bei einem Eintragsversuch eine Ausnahme ausgelöst. Alle anderen Fälle bleiben unerkannt.
Heraufstufbare Transaktionen in SQL Server
SQL Server unterstützt heraufstufbare Transaktionen, bei denen eine lokale kompakte Transaktion nur bei Bedarf automatisch zu einer verteilten Transaktion heraufgestuft werden kann. Eine heraufstufbare Transaktion ruft den zusätzlichen Aufwand einer verteilten Transaktion nur hervor, wenn dieser erforderlich ist. Weitere Informationen und ein Codebeispiel finden Sie unter System.Transactions-Integration mit SQL Server.
Konfigurieren von verteilten Transaktionen
Möglicherweise müssen Sie MS DTC über das Netzwerk aktivieren, um verteilte Transaktionen zu verwenden. Wenn die Windows-Firewall aktiviert ist, müssen Sie dem MS DTC-Dienst die Erlaubnis erteilen, das Netzwerk zu verwenden oder den MS DTC-Port zu öffnen.