Problem:
Eine .NET-Anwendung, die TransactionScope
verwendet, zeigt inkonsistentes Verhalten hinsichtlich der MSDTC-Eskalation. Auf einigen Entwicklercomputern eskaliert die Transaktion automatisch an Microsoft Distributed Transaction Coordinator (MSDTC), sodass MSDTC aktiviert werden muss. Bei anderen funktioniert derselbe Code auch ohne MSDTC korrekt.
Kontext:
TransactionScope
verwaltet den Datenzugriff innerhalb einer Transaktion.TransactionScope
verwendet werden. Der zweite Verbindungsversuch löst eine MSDTC-Eskalation auf den betroffenen Systemen aus.Untersuchung:
Anfängliche Annahmen über Unterschiede in der SQL Server-Version (2005 vs. 2008) erwiesen sich als falsch. Die Hauptursache liegt in den Einschränkungen von SQL Server 2005: Es unterstützt nicht mehrere Verbindungen innerhalb eines einzigen TransactionScope
, unabhängig von ihrer Öffnungsreihenfolge. Der Versuch einer zweiten Verbindung erzwingt eine Eskalation. SQL Server 2008 hingegen erlaubt mehrere Verbindungen innerhalb eines TransactionScope
, sofern diese nicht gleichzeitig geöffnet sind. Vorzeitiges Schließen und erneutes Öffnen von Verbindungen, möglicherweise durch Verbindungspooling und Datenzugriffsebenen (wie SqlTableAdapter
), können in SQL Server 2005 ebenfalls eine Eskalation auslösen.
Auflösung:
Für SQL Server 2005 verhindert die Aufrechterhaltung einer einzelnen, global gültigen, offenen Verbindung während der gesamten Transaktion eine MSDTC-Eskalation. Dies weicht jedoch von Best Practices ab, die eine effiziente Verbindungsverwaltung (Öffnen und Schließen nach Bedarf) befürworten. Ein Upgrade auf SQL Server 2008 oder höher ist die empfohlene Lösung, um diese Einschränkung zu vermeiden und Best Practices beizubehalten.
Das obige ist der detaillierte Inhalt vonWarum eskaliert TransactionScope auf einigen Computern zu MSDTC, auf anderen jedoch nicht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!