Verwenden von Virtual Clock-Werten

KTM bietet eine virtuelle Uhr für jedes Transaktions-Manager-Objekt. Wenn ein Ressourcen-Manager ZwCreateTransactionManager aufruft, legt KTM den Wert der virtuellen Uhr des Objekts auf 1 fest. KTM erhöht den Wert der virtuellen Uhr jedes Mal, wenn ein Commitvorgang beginnt. Jedes Mal, wenn KTM in den Protokolldatenstrom schreibt, enthält es den aktuellen wert der virtuellen Uhr im Protokolldatensatz.

Wenn ein Ressourcen-Manager ZwRecoverTransactionManager aufruft, liest KTM Protokolldatenströme bis zum Ende des Datenstroms und legt den Wert der virtuellen Uhr des Transaktions-Manager-Objekts auf den letzten Wert fest, den es im Protokollstream des Objekts findet.

Wenn ein Ressourcen-Manager ZwRollforwardTransactionManager aufruft, liest KTM Protokollstreamdatensätze bis zum angegebenen Taktwert und legt den wert der virtuellen Uhr des Transaktions-Manager-Objekts auf den angegebenen Taktwert fest.

KTM ermöglicht Ressourcen-Managern und überlegenen Transaktions-Managern das Ändern des virtuellen Uhrwerts eines Transaktions-Manager-Objekts, aber sie müssen in der Regel den Uhrwert nicht ändern.

Wann die Werte der virtuellen Uhr geändert werden sollen

In der Regel muss Ihr Transaktionsverarbeitungssystem (TPS) die Werte der virtuellen Uhr nicht ändern, es sei denn, die Komponenten in Ihrem TPS versuchen, mehrere Protokolldatenströme zu synchronisieren.

Angenommen, Ihr TPS enthält mehrere Ressourcen-Manager, die während Vorbereitungs-,Vorbereitungs-/Commitsequenzen miteinander kommunizieren. Angenommen, jeder Ressourcen-Manager erstellt ein Transaktions-Manager-Objekt mit einem eindeutigen Protokolldatenstrom. Um sicherzustellen, dass KTM den Zustand aller Ressourcenmanager während eines Wiederherstellungsvorgangs auf denselben Zeitpunkt wiederherstellt, können diese Ressourcenmanager die folgenden Schritte ausführen:

  • Wenn ein Ressourcen-Manager mit einem anderen kommuniziert, übergibt er den neuesten wert der virtuellen Uhr, den er entweder von KTM oder einem anderen Ressourcen-Manager erhalten hat.

  • Wenn ein Ressourcen-Manager eine KTM-Routine aufruft, die einen wert für eine virtuelle Uhr akzeptiert (siehe den folgenden Abschnitt in diesem Thema), übergibt er den höchsten Taktwert, den er von KTM oder einem anderen Ressourcen-Manager erhalten hat.

  • Jeder Ressourcen-Manager schreibt Virtuelle Uhrwerte in seinen Protokolldatenstrom und verwendet diese Werte, wenn er Rollback- oder Wiederherstellungsvorgänge ausführt.

Diese Schritte führen dazu, dass die Werte der virtuellen Uhr, die KTM für jedes Transaktions-Manager-Objekt speichert, fast oder genau übereinstimmen. Wenn ein Wiederherstellungsvorgang dazu führt, dass KTM seine Protokolldatenströme liest, oder wenn ein Rollbackvorgang dazu führt, dass die Ressourcenmanager ihre Protokolldatenströme lesen, basiert die Wiederherstellung oder das Rollback auf synchronisierten Protokolldatenströmen.

Ändern von Werten für virtuelle Uhren

Ressourcenmanager können den Wert der virtuellen Uhr ändern, indem sie einen neuen Wert an ZwPrePrepareComplete, ZwPrepareComplete, ZwCommitComplete, ZwRollbackComplete, ZwReadOnlyEnlistment oder ZwSinglePhaseReject übergeben.

Überlegene Transaktionsmanager können den Wert der virtuellen Uhr ändern, indem sie einen neuen Wert an ZwPrePrepareEnlistment, ZwPrepareEnlistment, ZwCommitEnlistment oder ZwReadOnlyEnlistment übergeben.

Darüber hinaus kann ein Ressourcen-Manager oder ein höherer Transaktions-Manager, der eine ResourceManagerNotification-Rückrufroutine verwendet, den Wert der virtuellen Uhr ändern, den die Rückrufroutine empfängt. KTM speichert dann den aktualisierten Wert.

Wenn ein Ressourcen-Manager oder ein höherer Transaktions-Manager einen neuen Uhrwert an KTM übergibt, speichert KTM den neuen Wert nur, wenn er größer als der aktuelle Taktwert ist. Andernfalls behält KTM den aktuellen Taktwert bei.

Ressourcen-Manager und überlegene Transaktionsmanager können den virtuellen Uhrwert eines Transaktions-Manager-Objekts abrufen, indem sie die ZwQueryInformationTransactionManager-Routine aufrufen.