Freigeben über


Durchführen einer Wiederherstellung

Ein Ressourcen-Manager erleichtert das Auflösen dauerhafter Eintragungen in einer Transaktion, indem er den Transaktionsteilnehmer nach einem Fehler der Ressource neu einträgt.

Der Wiederherstellungsprozess

Um eine Ressource dauerhaft einzutragen (wird durch eine Implementierung der IEnlistmentNotification-Schnittstelle beschrieben), damit sie später bei Bedarf wiederhergestellt werden kann, müssen Sie die EnlistDurable-Methode aufrufen. Darüber hinaus müssen Sie die EnlistDurable-Methode mit einem Ressourcen-Manager-Bezeichner ausstatten (Guid), der dazu verwendet wird, den Teilnehmer an einer Transaktion im Falle eines Ressourcenfehlers eindeutig zu kennzeichnen. Aus diesem Grund muss die Guid, die dem anfänglichen Eintragungsaufruf bereitgestellt wird, mit dem Parameter resourceManagerIdentifier im Reenlist-Aufruf bei 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 muss alle notwendigen Informationen enthalten, um den Commit der Transaktion auszuführen. 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 durchgeführt werden, da der RM dies mit einem Arbeitsthread erledigen kann.

Der Wiederherstellungsprozess läuft in zwei Schritten ab:

Schritt - Erneute Eintragung

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. Es wird ein neues Enlistment-Objekt zurückgegeben. Schlägt die erneute Eintragung mit einer Ausnahme fehl, muss der Ressourcen-Manager zu einem späteren Zeitpunkt einen neuen Versuch unternehmen.

Rufen Sie die Reenlist-Methode nur auf, wenn ein Ressourcen-Manager nach einem Fehler neu gestartet wird. Tragen Sie außerdem nur nicht aufgelöste Transaktionen erneut ein, die von einem Ressourcen-Manager während der anfänglichen Vorbereitungsphase eines Zweiphasencommits protokolliert wurden. Bei jedem Versuch, diese Methode zu unzulässigen Zeitpunkten aufzurufen, können falsche Ergebnisse erzeugt werden.

Wenn ein Teilnehmer mit dieser Methode neu eingetragen wird, werden die IEnlistmentNotification-Methoden aus Phase 2, die dem Transaktionsergebnis entsprechen (d. h. Commit, Rollback oder InDoubt), aufgerufen.

Schritt - Durchführen der Wiederherstellung

Wenn alle Neueintragungen erfolgt sind, ruft der Ressourcen-Manager 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 Ressourcen-Manager, dass er die Reenlist-Methode nicht noch einmal aufruft.

Ein Ressourcen-Manager braucht nicht alle zweifelhaften Transaktionen aufzulösen, bevor er Eintragungen in neue Transaktionen vornimmt. Der erste Schritt kann jederzeit ausgeführt werden, nachdem der Ressourcen-Manager die Verbindung zum Transaktions-Manager hergestellt hat. Nach Aufrufen von RecoveryComplete (Schritt 2) kann Schritt 1 jedoch nicht erneut ausgeführt werden. Schritt 2 kann mehrmals wiederholt werden, ohne das Ergebnis von Transaktionen zu beeinflussen.