Teilen über


Transaktionsverwaltungseskalation

Windows hostet eine Reihe von Diensten und Modulen, die zusammen einen Transaktionsmanager bilden. Die Transaktionsverwaltungseskalation beschreibt den Prozess der Migration einer Transaktion von einer der Komponenten des Transaktionsmanagers zu einer anderen.

System.Transactions enthält eine Transaktions-Manager-Komponente, die eine Transaktion mit höchstens einer einzigen dauerhaften Ressource oder mehreren veränderbaren Ressourcen koordiniert. Da der Transaktionsmanager nur domäneninterne Domänenaufrufe verwendet, liefert er die beste Leistung. Entwickler müssen nicht direkt mit dem Transaktionsmanager interagieren. Stattdessen wird eine allgemeine Infrastruktur, die Schnittstellen, allgemeines Verhalten und Hilfsklassen definiert, vom System.Transactions Namespace bereitgestellt.

Wenn Sie die Transaktion einem Objekt in einer anderen Anwendungsdomäne (einschließlich prozess- und computerübergreifender Grenzen) auf demselben Computer bereitstellen möchten, eskaliert die System.Transactions Infrastruktur automatisch die Transaktion, die vom Microsoft Distributed Transaction Coordinator (MSDTC) verwaltet wird. Die Eskalation tritt auch auf, wenn Sie einen anderen dauerhaften Ressourcenmanager hinzuziehen. Nach der Eskalation wird die Transaktion bis zu ihrem Abschluss weiterhin in ihrem eskalierten Zustand verwaltet.

Zwischen der System.Transactions-Transaktion und der MSDTC-Transaktion existiert ein zwischengeschalteter Transaktionstyp, der über die Promotable Single Phase Enlistment (PSPE) bereitgestellt wird. PSPE ist ein weiterer wichtiger Mechanismus in System.Transactions zur Leistungsoptimierung. Er ermöglicht es, dass sich eine einzelne dauerhafte Remoteressource, die sich in einer anderen Anwendungsdomäne, einem anderen Prozess oder auf einem anderen Computer befindet, an einer System.Transactions-Transaktion beteiligt, ohne dass diese dadurch zu einer MSDTC-Transaktion eskaliert wird. Weitere Informationen zu PSPE finden Sie unter Ressourcen als Teilnehmer in einer Transaktion auflisten.

Wie Eskalation initiiert wird

Die Eskalation von Transaktionen verringert die Leistung, da sich der MSDTC in einem separaten Prozess befindet und das Eskalieren einer Transaktion zum MSDTC dazu führt, dass Nachrichten über Prozessgrenzen hinweg gesendet werden. Um die Leistung zu verbessern, sollten Sie die Eskalation zu MSDTC verzögern oder vermeiden; Daher müssen Sie wissen, wie und wann die Eskalation eingeleitet wird.

Solange die System.Transactions Infrastruktur veränderliche Ressourcen und höchstens eine dauerhafte Ressource verarbeitet, die Einzelphasenbenachrichtigungen unterstützt, verbleibt die Transaktion im Besitz der System.Transactions Infrastruktur. Der Transaktions-Manager nutzt nur die Ressourcen, die in derselben Anwendungsdomäne leben und für die protokollierung (Schreiben des Transaktionsergebnisses auf datenträger) nicht erforderlich ist. Eine Eskalation, die dazu führt, dass die System.Transactions Infrastruktur den Besitz der Transaktion an MSDTC überträgt, tritt ein, wenn:

  • Mindestens eine dauerhafte Ressource, die keine Einzelphasenbenachrichtigungen unterstützt, wird in der Transaktion aufgelistet.

  • Mindestens zwei dauerhafte Ressourcen, die Einzelphasenbenachrichtigungen unterstützen, werden in der Transaktion aufgelistet. Das Auflisten einer einzelnen Verbindung mit SQL Server 2005 führt beispielsweise nicht dazu, dass eine Transaktion heraufgestuft wird. Wenn jedoch eine zweite Verbindung mit einer SQL Server 2005-Datenbank hergestellt und die Datenbank daher eingetragen wird, erkennt die System.Transactions-Infrastruktur, dass eine zweite dauerhafte Ressource in der Transaktion vorhanden ist und eskaliert diese zu einer MSDTC-Transaktion.

  • Eine Anforderung, die Transaktion in eine andere Anwendungsdomäne oder einen anderen Prozess zu übertragen, wird aufgerufen. Beispielsweise die Serialisierung des Transaktionsobjekts über eine Anwendungsdomänengrenze hinweg. Das Transaktionsobjekt wird wertbasiert gemarshallt, d. h. jeder Versuch, es über eine Anwendungsdomänengrenze (auch innerhalb desselben Prozesses) zu übergeben, führt zur Serialisierung des Transaktionsobjekts. Sie können die Transaktionsobjekte übergeben, indem Sie eine Remotemethode aufrufen, die einen Transaction als Parameter verwendet, oder indem Sie versuchen, auf eine Komponente mit Remote-Transaktionsservice zuzugreifen. Dadurch wird das Transaktionsobjekt serialisiert und führt zu einer Eskalation, ähnlich wie wenn eine Transaktion in einer Anwendungsdomäne serialisiert wird. Das System wird verteilt, und der lokale Transaktionsmanager ist nicht mehr ausreichend.

In der folgenden Tabelle sind alle möglichen Ausnahmen aufgeführt, die während der Eskalation ausgelöst werden können.

Ausnahmetyp Zustand
InvalidOperationException Ein Versuch, eine Transaktion mit einem Isolationsgrad gleich Snapshot zu eskalieren.
TransactionAbortedException Der Transaktions-Manager ist nicht aktiv.
TransactionException Die Eskalation schlägt fehl, und die Anwendung wird abgebrochen.