Behandeln von Wiederherstellungsvorgängen
Bei einem Wiederherstellungsvorgang versucht ein Transaktionsverarbeitungssystem (TPS), seinen Zustand anhand der Informationen in Protokollstreams wiederherzustellen. Nach Abschluss eines Wiederherstellungsvorgangs sollten sich alle Transaktionen in einem Commit- oder Rollbackstatus befinden, und alle Ressourcendaten sollten sich in einem bekannten guten Zustand befinden.
Manchmal wird ein TPS beendet, bevor alle Transaktionen abgeschlossen sind. Beispielsweise kann das Betriebssystem abstürzen. Daher müssen Ressourcen-Manager bei jedem Start mit der Ausführung Wiederherstellungsvorgänge initiieren. Der Wiederherstellungsvorgang versucht, zu bestimmen, ob Transaktionen unvollständig sind. Wenn unvollständige Transaktionen im Protokoll gefunden werden, versucht der Wiederherstellungsvorgang, einen Commit oder ein Rollback für diese Transaktionen durchzuführen.
Bei einem KTM-basierten TPS besteht jeder Wiederherstellungsvorgang aus zwei Schritten. Der erste Schritt umfasst die Wiederherstellung von Informationen aus dem Protokolldatenstrom des Transaktions-Manager-Objekts. Im zweiten Schritt werden Informationen aus dem Protokolldatenstrom des Ressourcen-Managers wiederhergestellt.
Ein TPS kann bis zum Ende aller Protokolldatenströme wiederhergestellt werden. Wenn seine Ressourcenmanager virtuelle Uhrwerte verwalten, kann er bis zu einem angegebenen Uhrwert wiederhergestellt werden.
Wiederherstellen von Informationen aus dem Protokolldatenstrom eines Transaction Manager-Objekts
Unmittelbar nachdem ein Ressourcen-Manager ZwCreateTransactionManager oder ZwOpenTransactionManager aufgerufen hat, muss er ZwRecoverTransactionManager aufrufen. Die ZwRecoverTransactionManager-Routine liest den Protokolldatenstrom, der zum Transaktions-Manager-Objekt gehört. Diese Routine rekonstruiert den Status des Transaktions-Manager-Objekts (einschließlich aller Transaktionen, Einlistungen und Ressourcen-Manager) aus den Wiederherstellungsinformationen, die sich im Protokolldatenstrom befinden, beginnend beim letzten Neustartbereich , den KTM erstellt hat, und endet am Ende des Datenstroms.
Der Ressourcen-Manager kann ZwRollforwardTransactionManager anstelle von ZwRecoverTransactionManager aufrufen, um die Wiederherstellung vom letzten Neustartbereich bis zu einem angegebenen virtuellen Uhrwert durchzuführen.
Wiederherstellen von Informationen aus dem Protokolldatenstrom eines Resource Manager
Unmittelbar nachdem ein Ressourcen-Manager ZwCreateResourceManager oder ZwOpenResourceManager aufgerufen hat, muss er ZwRecoverResourceManager aufrufen. Die ZwRecoverResourceManager-Routine versucht, die Transaktionen wiederherzustellen, die den einzelnen Eintragen des Ressourcen-Managers zugeordnet sind.
Wenn ein Ressourcen-Manager ZwRecoverResourceManager aufruft, sendet KTM TRANSACTION_NOTIFY_RECOVER Benachrichtigungen für jede Der Eintrage des Ressourcen-Managers. Der Ressourcen-Manager muss ZwRecoverEnlistment jedes Mal aufrufen, wenn er eine der TRANSACTION_NOTIFY_RECOVER-Benachrichtigungen empfängt.
Wenn der Ressourcen-Manager ZwRecoverEnlistment aufruft, sendet KTM eine der folgenden Benachrichtigungen:
TRANSACTION_NOTIFY_COMMIT
Der Ressourcen-Manager muss Informationen in seinem Protokolldatenstrom verwenden, um die Transaktion zu committen, und dann muss ZwCommitComplete aufrufen.
TRANSACTION_NOTIFY_ROLLBACK
Der Ressourcen-Manager muss Informationen in seinem Protokolldatenstrom verwenden, um ein Rollback für die Transaktion auszuführen, und dann ZwRollbackComplete aufrufen.
TRANSACTION_NOTIFY_INDOUBT
KTM hat den Status der Transaktion nicht ermittelt und sendet später eine Commit- oder Rollbackbenachrichtigung.
In der Regel sendet KTM eine TRANSACTION_NOTIFY_COMMIT Benachrichtigung, wenn ermittelt wird, dass alle Ressourcen-Manager ZwPrepareComplete aufgerufen haben , bevor der TPS beendet und neu gestartet wurde. KTM sendet eine TRANSACTION_NOTIFY_ROLLBACK Benachrichtigung, wenn festgestellt wird, dass mindestens ein Ressourcenmanager ZwPrepareComplete nicht aufgerufen hat.
Nachdem KTM eine TRANSACTION_NOTIFY_RECOVER Benachrichtigung für jede Einsendung gesendet hat, sendet es eine TRANSACTION_NOTIFY_LAST_RECOVER Benachrichtigung.
Wenn Ihr Ressourcen-Manager ZwRollforwardTransactionManager anstelle von ZwRecoverTransactionManager genannt hat, muss er nur bis zum virtuellen Uhrwert wiederherstellen, den er für ZwRollforwardTransactionManager angegeben hat.
Ressourcen-Manager können ZwSetInformationEnlistment aufrufen, um benutzerdefinierte Wiederherstellungsinformationen festzulegen. KTM speichert diese Informationen und schreibt sie in den Protokolldatenstrom, aber KTM versucht nicht, die Informationen zu interpretieren. Der Ressourcen-Manager kann die Wiederherstellungsinformationen jederzeit abrufen, indem er ZwQueryInformationEnlistment aufruft.
Erstklassige Transaktionsmanager erhalten manchmal während eines Wiederherstellungsvorgangs TRANSACTION_NOTIFY_RECOVER_QUERY Benachrichtigungen.