Freigeben über


Wiederherstellungsverarbeitung

Nach jedem Fehler, der die normale Transaktionsverarbeitung stört, müssen KTM und jeder Ressourcen-Manager Wiederherstellungsvorgänge ausführen. Die Wiederherstellung ist der Prozess, bei dem Transaktionsteilnehmer zu einer konsistenten Ansicht des Status jeder Transaktion gelangen.

Ressourcenmanager haben möglicherweise Zweifel am Ergebnis einer Transaktion, was bedeutet, dass sie zum Zeitpunkt des Fehlers eine TRANSACTION_NOTIFY_PREPARE Benachrichtigung erhalten hatten, sich auf eine dauerhafte Speicherung vorbereitet hatten, aber kein endgültiges Ergebnis für die Transaktion erhalten (oder nicht protokolliert haben). Ebenso kann KTM zweifeln, wenn eine Transaktion vorbereitet, aber kein Ergebnis erhalten (oder nicht protokolliert) wurde. Zur Wiederherstellungszeit müssen alle Ergebnisse, die gesendet, aber nicht bestätigt wurden, erneut gesendet werden. Wenn z. B. ein Ressourcen-Manager eine TRANSACTION_NOTIFY_COMMIT Benachrichtigung erhalten und die CommitComplete-Funktion aufgerufen hat , erhält der Ressourcenverwaltungsdienst zum Zeitpunkt der Wiederherstellung möglicherweise noch eine doppelte TRANSACTION_NOTIFY_COMMIT Benachrichtigung.

Damit eine Transaktion nach einem Ressourcen-Manager- oder Systemfehler ordnungsgemäß wiederhergestellt werden kann, muss jeder Ressourcen-Manager bei jedem Start die folgenden Schritte ausführen:

  1. Rufen Sie die OpenResourceManager-Funktion auf, um das Resource Manager-Handle mit dem eindeutigen, persistenten Namen erneut zu öffnen. Dadurch wird KTM informiert, dass der Ressourcen-Manager wieder ausgeführt wird und für die Wiederherstellung verfügbar ist. Wenn keine Wiederherzustellenden Listen vorhanden sind, kann der Aufruf von OpenResourceManager fehlschlagen. Rufen Sie CreateResourceManager auf, um das RM-Objekt neu zu erstellen.

  2. Rufen Sie RecoverResourceManager auf. Der Ressourcen-Manager erhält ein TRANSACTION_NOTIFY_RECOVER Benachrichtigungsereignis für jede Registrierung, für die er Wiederherstellungsvorgänge ausführen muss, gefolgt von einem TRANSACTION_NOTIFY_LAST_RECOVER. Das Benachrichtigungsereignis enthält einen global eindeutigen Bezeichner sowohl für die Transaktion als auch für die Registrierung.

  3. Rufen Sie die OpenEnlistment-Funktion auf, um jedes Eintragshandle, für das der Ressourcen-Manager eine TRANSACTION_NOTIFY_RECOVER Benachrichtigung erhalten hat, erneut zu öffnen.

  4. Rufen Sie für jede von OpenEnlistment geöffnete Registrierung RecoverEnlistment auf. Dies führt dazu, dass die TRANSACTION_NOTIFY_COMMIT- oder TRANSACTION_NOTIFY_INDOUBT-Benachrichtigung erneut zugestellt wird.

  5. Wenn der RM TRANSACTION_NOTIFY_COMMIT empfangen hat, kann der RM die Transaktion abschließen, indem CommitComplete aufgerufen wird.

    Wenn der RM TRANSACTION_NOTIFY_INDOUBT empfangen hat, sollte der RM warten, bis die Ergebnisbenachrichtigung eintrifft.

  6. Bei Transaktionen, für die der RM keine TRANSACTION_NOTIFY_RECOVER-Benachrichtigung empfängt, aber zuvor eine TRANSACTION_NOTIFY_PREPARE Benachrichtigung erhalten hat, sollte der RM die Transaktion so verarbeiten, als würde ein Rollback ausgeführt.

Hinweis

Ressourcenmanager dürfen sich bei der Wiederherstellung anmelden oder neue Transaktionen erstellen.

 

KTM verwendet ein modelliertes Abbruchtransaktionsmodell . Das folgende Szenario veranschaulicht dieses Verhalten. Angenommen, KTM und ein Ressourcen-Manager befinden sich auf demselben Computer. Angenommen, KTM gibt eine Vorbereitungsbenachrichtigung für eine Transaktion aus, aber das System stürzt ab, bevor KTM die Vorbereitungsbenachrichtigung protokolliert. Angenommen, der Ressourcen-Manager empfängt und protokolliert die Vorbereitungsbenachrichtigung unmittelbar vor dem Systemabsturz. Nach der Wiederherstellung des Systems hat KTM keine Kenntnis von der Transaktion, da die Vorbereitungsphase nie protokolliert wurde. Der Ressourcen-Manager verfügt über Kenntnisse der Transaktion, da er die Vorbereitungsbenachrichtigung empfangen, verarbeitet und protokolliert hat. Wenn KTM seine Wiederherstellungsbenachrichtigungen ausgibt, enthält der Ressourcen-Manager keine Wiederherstellungsbenachrichtigung für die betreffende Transaktion. Mit dem angenommenen Abbruchmodell behandelt der Ressourcen-Manager in diesem Fall die vorbereitete Transaktion als abgebrochen, wenn er keine Benachrichtigungen zum Durchführen der Wiederherstellung für diese Transaktion empfängt.