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.
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
Wenn ein DataReader gestartet wird, während die Transaktion aktiv ist, und Sie versuchen, einen Commit oder Rollback für diese Transaktion auszuführen, wird eine Ausnahme ausgelöst.
Arbeiten mit System.Transactions
In .NET Framework werden verteilte Transaktionen durch 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 Beteiligung an einer verteilten Transaktion mithilfe der EnlistTransaction-Methode ein, die eine Verbindung in einer Transaction-Instanz beteiligt. In früheren Versionen von ADO.NET wurde die explizite Eintragung in verteilte Transaktionen mithilfe der EnlistDistributedTransaction-Methode einer Verbindung für das Eintragen einer Verbindung in eine ITransaction-Instanz durchgeführt, die aus Gründen der Abwärtskompatibilität unterstützt wird. Weitere Informationen zu Enterprise Services-Transaktionen finden Sie unter Interoperabilität mit Enterprise Services- und COM+-Transaktionen.
Wenn eine System.Transactions-Transaktion mit dem .NET Framework-Anbieter für SQL Server unter Verwendung einer SQL Server-Datenbank verwendet wird, wird automatisch eine kompakte 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.
Hinweis
Die maximale Anzahl an verteilten Transaktionen, an denen eine Oracle-Datenbank gleichzeitig teilnehmen kann, liegt standardmäßig bei 10. Nach der zehnten Transaktion wird, bei Verbindung mit einer Oracle-Datenbank, eine Ausnahme ausgelöst. Oracle bietet keine Unterstützung für DDL innerhalb einer verteilten Transaktion.
Automatisches Eintragen in eine verteilte Transaktion
Die automatische Einschreibung ist die Standardmethode (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. Die automatische Eintragung in vorhandene Transaktionen kann durch die Angabe von Enlist=false als Parameter der Verbindungszeichenfolge für eine SqlConnection.ConnectionString oder von OLE DB Services=-7 als Parameter der Verbindungszeichenfolge für eine OleDbConnection.ConnectionString deaktiviert werden. Weitere Informationen zu Oracle- und ODBC-Parametern der Verbindungszeichenfolge finden Sie in OracleConnection.ConnectionString und OdbcConnection.ConnectionString.
Manuelles Eintragen in eine verteilte Transaktion
Wenn die automatische Eintragung deaktiviert ist oder wenn Sie eine Transaktion eintragen müssen, die nach dem Herstellen der Verbindung begonnen wurde, können Sie eine vorhandene verteilte Transaktion mithilfe der EnlistTransaction-Methode des DbConnection-Objekts für den entsprechenden Anbieter eintragen. Durch die Teilnahme an einer vorhandenen verteilten Transaktion wird sichergestellt, dass, wenn die Transaktion festgeschrieben oder zurückgesetzt wird, die vom Code an der Datenquelle vorgenommenen Änderungen ebenfalls festgeschrieben oder zurückgesetzt werden.
Die Beteiligung an verteilten Transaktionen ist besonders sinnvoll beim Pooling von Geschäftsobjekten. Wenn sich ein Geschäftsobjekt mit einer offenen Verbindung in einem Pool befindet, erfolgt die automatische Transaktionsregistrierung nur, wenn diese Verbindung geöffnet wird. Wenn mehrere Transaktionen bei Verwendung des gepoolten Geschäftsobjekts ausgeführt werden, wird die für dieses Objekt geöffnete Verbindung nicht automatisch in neu initiierte Transaktionen einbezogen. 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. Durch das Übergeben eines NULL-Werts wird die Verbindung aus der aktuellen verteilten Transaktionseinbindung 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 werden nicht darüber benachrichtigt, dass die lokale Transaktion zurückgesetzt wurde, und müssen alle lokalen Transaktionen, die nicht mithilfe von BeginTransaction gestartet wurden, selbst verwalten. Wenn Sie den .NET Framework-Datenanbieter für SQL Server (SqlClient) mit SQL Server verwenden, wird beim Versuch, sich einzutragen, 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 öffnen.