Freigeben über


Durchführen einer Wiederherstellung

Ein Ressourcenmanager erleichtert die Auflösung dauerhafter Beteiligungen in einer Transaktion, indem er den Transaktionsteilnehmer nach einem Ressourcenausfall erneut anmeldet.

Der Wiederherstellungsvorgang

Um eine Ressource (die durch eine Implementierung der IEnlistmentNotification Schnittstelle beschrieben wird) dauerhaft aufzurufen, die später für die Wiederherstellung geeignet sein kann, sollten Sie die EnlistDurable Methode aufrufen. Darüber hinaus müssen Sie die EnlistDurable Methode mit einem Ressourcen-Manager-Bezeichner (a Guid) bereitstellen, der verwendet wird, um den Teilnehmer der Transaktion im Falle eines Ressourcenausfalls konsistent zu bezeichnen. Aus diesem Grund sollte das dem anfänglichen Enlist-Aufruf bereitgestellte Guid Element mit dem resourceManagerIdentifier-Parameter im Reenlist-Aufruf während der Wiederherstellung identisch sein. Andernfalls wird eine TransactionException-Ausnahme ausgelöst. Weitere Informationen zu dauerhaften Eintragungen finden Sie unter Eintragen von Ressourcen als Teilnehmer an einer Transaktion.

Wenn der von Ihnen implementierte dauerhafte Ressourcen-Manager in der Vorbereitungsphase (Phase 1) des 2PC-Protokolls die Prepare-Benachrichtigung erhält, muss er seinen Vorbereitungsdatensatz während dieser Phase protokollieren. Der Datensatz sollte alle Informationen enthalten, die zum Abschließen der Transaktion beim Commit erforderlich sind. Auf den Vorbereitungsdatensatz kann später bei der Wiederherstellung durch Abrufen der RecoveryInformation-Eigenschaft des -Rückrufs zugegriffen werden. Die Datensatzprotokollierung muss nicht innerhalb der Prepare Methode ausgeführt werden, da der RM dies in einem Arbeitsthread ausführen kann.

Der Wiederherstellungsvorgang besteht aus den folgenden beiden Schritten:

Schritt 1 - Wiedereinlisten

Der Ressourcen-Manager untersucht den Vorbereitungsdatensatz jeder Eintragung, die zweifelhaft ist. Dies geschieht durch Überprüfung der RecoveryInformation-Eigenschaft des PreparingEnlistment-Aufrufs, der in der Prepare-Benachrichtigung während Phase 1 an den Ressourcen-Manager übergeben wird.

Für jede Eintragung, die es untersucht, ruft er Reenlist für den Transaktions-Manager auf. Diese Methode gibt eine eindeutige Guid weiter, die den Ressourcen-Manager und die Informationen der Eintragung in einem Bytearray identifiziert. Ein neues Enlistment Objekt wird zurückgegeben. Wenn die Wiedereingliederung aufgrund einer Ausnahmebedingung fehlschlägt, muss der Ressourcenmanager zu einem späteren Zeitpunkt erneut versuchen.

Rufen Sie die Reenlist-Methode nur auf, wenn ein Ressourcen-Manager nach einem Fehler neu gestartet wird. Darüber hinaus sollten Sie während der ersten Vorbereitungsphase eines zweistufigen Commits nur nicht aufgelöste Transaktionen erneut auflisten, die von einem Ressourcenmanager protokolliert werden. Jeder Versuch, diese Methode zu ungültigen Zeiten aufzurufen, kann zu fehlerhaften Ergebnissen führen.

Wenn ein Teilnehmer mit dieser Methode wiedereingetragen wird, werden die Phase-2-Methoden von IEnlistmentNotification, die dem Ergebnis der Transaktion entsprechen (d. h. Commit, Rollback oder InDoubt), entsprechend aufgerufen.

Schritt 2 : Abschließen der Wiederherstellung

Wenn alle Neulisten abgeschlossen sind, ruft der Ressourcenmanager die RecoveryComplete Methode auf. Diese Methode führt die Wiederherstellung zu Ende und informiert den Transaktions-Manager darüber, dass der Ressourcen-Manager über keine weiteren zweifelhaften Transaktionen verfügt. Dadurch garantiert der Ressourcenmanager, dass die Reenlist Methode nicht erneut aufgerufen wird.

Ein Ressourcenmanager muss nicht alle ungeklärten Transaktionen auflösen, bevor neue Transaktionen aufgenommen werden. Der erste Schritt kann jederzeit ausgeführt werden, nachdem der Ressourcen-Manager eine Beziehung mit dem Transaktions-Manager eingerichtet hat; jedoch kann Schritt 1 nicht mehr ausgeführt werden, nachdem RecoveryComplete aufgerufen wurde (Schritt 2). Schritt 2 kann mehrmals wiederholt werden, ohne dass sich dies auf das Ergebnis von Transaktionen auswirkt.