Freigeben über


Optimierung mit Einphasencommit und heraufstufbarer Einphasenbenachrichtigung

In diesem Thema wird der Mechanismus beschrieben, der von der System.Transactions-Infrastruktur zur Leistungsoptimierung bereitgestellt wird.

Heraufstufbare Einphaseneintragung (PSPE)

Die System.Transactions-Infrastruktur verwaltet eine Transaktion innerhalb einer einzelnen Anwendungsdomäne, die höchstens eine dauerhafte Ressource oder mehrere flüchtige Ressourcen umfasst. Da die System.Transactions-Infrastruktur nur Domänenaufrufe innerhalb von Anwendungen verwendet, bietet sie den besten Durchsatz und die beste Leistung.

Wenn die Transaktion jedoch einem anderen Objekt in einer anderen Anwendungsdomäne (darunter fallen auch diejenigen, die prozess- und geräteübergreifend sind) auf demselben Computer bereitgestellt wird oder Sie einen anderen Manager für dauerhafte Ressourcen eintragen, eskaliert die System.Transactions-Infrastruktur automatisch die Transaktion, die von MS DTC verwaltet werden soll. Eine vom MSDTC verwaltete Transaktion ist nicht so leistungsfähig wie eine von der System.Transactions-Infrastruktur verwaltete.

Um die Leistung zu optimieren, stellt die System.Transactions-Infrastruktur die Erweiterbare Einphaseneintragung (Promotable Single Phase Enlistment, PSPE) bereit, die es einer einzelnen dauerhaften Remote-Ressource in einer anderen Anwendungsdomäne, einem anderen Prozess oder auf einem anderen Gerät ermöglicht, an einer System.Transactions-Transaktion teilzunehmen, ohne dass sie dadurch zu einer MSDTC-Transaktion eskaliert wird. Dieser Ressourcen-Manager (RM) kann eine Transaktion hosten und "besitzen", die später bei Bedarf zu einer verteilten Transaktion (oder einer MSDTC-Transaktion) eskaliert werden kann. Dies reduziert die Wahrscheinlichkeit, dass der MSDTC verwendet wird.

Dieser spezielle Ressourcen-Manager verfügt gewöhnlich über eigene interne, nicht verteilte Transaktionen und muss die Konvertierung dieser Transaktionen in verteilte Transaktionen zur Laufzeit unterstützen. SQL Server 2005 ist beispielsweise so ein Ressourcen-Manager. In diesem Fall übernimmt die System.Transactions-Infrastruktur eine passive Verwaltungsrolle, indem sie lediglich überwacht, ob die Transaktion eskaliert werden muss. Damit die Interaktion zwischen der System.Transactions-Infrastruktur und dem Ressourcen-Manager unterstützt wird, muss der Ressourcen-Manager die Schnittstelle IPromotableSinglePhaseNotification implementieren.

Die EnlistPromotableSinglePhase-Methode wird verwendet, um eine einzelne dauerhafte Ressource einzutragen, die später eskaliert werden kann. Diese Methode stellt sicher, dass die Eintragung nach Bedarf eskaliert werden kann. Wenn die Eintragung erfolgreich ist, erstellt der RM seine interne Transaktion und ordnet sie der System.Transactions-Transaktion zu. Wenn die PSPE-Eintragung fehlschlägt, sollte der RM die Eintragung stattdessen mit der EnlistDurable-Methode vornehmen. Zum Fehlschlagen der Eintragung in PSPE kann es kommen, wenn die Transaktion bereits verteilt ist oder ein anderer RM bereits eine PSPE-Eintragung vorgenommen hat.

Sobald die Eintragung erfolgt ist, werden Clientaufrufe zum Commit oder Abbruch der System.Transactions-Transaktion in Aufrufe an den Ressourcen-Manager konvertiert, indem die SinglePhaseCommit-Methode bzw. die Rollback-Methode aufgerufen wird.

Wenn die System.Transactions-Transaktion zu keinem Zeitpunkt eine Eskalation erfordert, erhält der RM eine SinglePhaseCommit-Benachrichtigung, sobald ein Commit für die Transaktion ausgeführt wird. Er kann dann einen Commit für die interne Transaktion ausführen, die anfänglich erstellt wurde.

Wenn die System.Transactions-Transaktion eskaliert werden muss (beispielsweise, um mehrere RMs zu unterstützen), informiert System.Transactions den Ressourcen-Manager durch Aufrufen der Promote-Methode für die ITransactionPromoter-Schnittstelle, von der die IPromotableSinglePhaseNotification-Schnittstelle abgeleitet wurde. Der Ressourcen-Manager konvertiert die Transaktion dann intern von einer lokalen Transaktion (die keine Protokollierung erfordert) in ein Transaktionsobjekt, das an einer DTC-Transaktion teilnehmen kann, und ordnet es den bereits erledigten Aufgaben zu. Wenn der Commit der Transaktion angefordert wird, sendet der Transaktions-Manager auch in diesem Fall die SinglePhaseCommit-Benachrichtigung an den Ressourcen-Manager, der einen Commit für die verteilte Transaktion ausführt, die er während der Eskalation erstellt hat.

NoteHinweis:

Die TransactionCommitted-Ablaufverfolgungen (die generiert werden, wenn ein Commit für die eskalierte Transaktion aufgerufen wird) enthalten die Aktivitäts-ID der DTC-Transaktion.

Weitere Informationen über die Verwaltungseskalation finden Sie unter Eskalation der Transaktionsverwaltung.

Eskalationsszenario der Transaktionsverwaltung

Das folgende Szenario veranschaulicht die Eskalation zu einer verteilten Transaktion unter Verwendung des System.Data-Namespace als 'Proxy' für den Ressourcen-Manager. Bei diesem Szenario wird vorausgesetzt, dass bereits eine System.Data-Verbindung (CN1) zur Datenbank besteht, die von der Transaktion betroffen ist, und dass die Anwendung eine weitere System.Data-Verbindung (CN2) einbeziehen will. Die Transaktion muss als vollständig verteilte Zweiphasencommit-Transaktion zum DTC eskaliert werden.

In diesem Szenario

  1. ruft CN1 die EnlistPromotableSinglePhase-Methode auf, um sich in die Transaktion einzutragen. Dann ist die Transaktion weiterhin lokal, und es gibt keine anderen heraufstufbaren Eintragungen für die Transaktion, weshalb der EnlistPromotableSinglePhase-Aufruf erfolgreich ist.

  2. Wenn die zweite Verbindung, CN2, EnlistPromotableSinglePhase aufruft, schlägt der Aufruf fehl, da eine andere erweiterbare Eintragung betroffen ist. Deswegen muss CN2 eine DTC-Transaktion abrufen, um sie an SQL zu übergeben. Zu diesem Zweck verwendet die Verbindung eine der Methoden, die von der TransactionInterop-Klasse bereitgestellt werden, um ein Transaktionsformat zu erzeugen, das an SQL übergeben werden kann.

  3. System.Transactions ruft die Promote-Methode für die ITransactionPromoter-Schnittstelle auf, die von CN1 implementiert wurde.

  4. Dann eskaliert CN1 die Transaktion anhand eines Mechanismus, der spezifisch für SQL 2005 und System.Data ist.

  5. Der Rückgabewert der Promote-Methode ist ein Bytearray, das ein Weitergabetoken für die Transaktion enthält. System.Transactions verwendet dieses Weitergabetoken, um eine DTC-Transaktion zu erstellen, die es in eine lokale Transaktion einbinden kann.

  6. Jetzt kann CN2 die Daten, die sie durch den Aufruf einer der Methoden mit TransactionInterop erhalten hat, dazu verwenden, die Transaktion an SQL zu übergeben.

  7. Jetzt sind beide in eine verteilte DTC-Transaktion eingetragen.

Optimierung des Einphasencommit

Das Einphasencommit-Protokoll ist zur Laufzeit effizienter, da alle Updates ohne eine explizite Koordination ausgeführt werden. Um diese Optimierung nutzen zu können, sollten Sie anhand der ISinglePhaseNotification-Schnittstelle für die Ressource einen Ressourcen-Manager implementieren und mithilfe der EnlistDurable-Methode oder der EnlistVolatile-Methode eine Eintragung in eine Transaktion vornehmen. Der EnlistmentOptions-Parameter muss None lauten, um sicherzustellen, dass ein Einphasencommit ausgeführt wird.

Da die ISinglePhaseNotification-Schnittstelle von der IEnlistmentNotification-Schnittstelle abgeleitet ist, kann der Ressourcen-Manager, wenn er für Einphasencommit nicht geeignet ist, trotzdem die Zweiphasencommit-Benachrichtigungen empfangen. Wenn der Ressourcen-Manager eine SinglePhaseCommit-Benachrichtigung vom Transaktions-Manager empfängt, sollte er versuchen, die notwendigen Aufgaben für ein Commit auszuführen, und den TM informieren, ob ein Commit oder ein Rollback für die Transaktion ausgeführt werden soll, indem er die Methode Committed, Aborted oder InDoubt des SinglePhaseEnlistment-Parameters aufruft. Die Antwort Done auf die Eintragung in dieser Phase impliziert die Semantik ReadOnly. Deshalb sollten Sie nicht zusätzlich zu den anderen Methoden Done antworten.

Wenn es nur eine flüchtige Eintragung und keine dauerhafte Eintragung gibt, empfängt die flüchtige Eintragung eine Einphasencommit-Benachrichtigung.  Wenn flüchtige Eintragungen vorhanden sind, aber nur eine dauerhafte Eintragung, empfangen die flüchtigen Eintragungen ein Zweiphasencommit. Nach Beendigung empfängt die dauerhafte Eintragung ein Einphasencommit.

Siehe auch

Konzepte

Eintragen von Ressourcen als Teilnehmer an einer Transaktion
Ausführen eines Einphasen- oder Mehrphasencommits für eine Transaktion

Footer image

Copyright © 2007 by Microsoft Corporation. Alle Rechte vorbehalten.