Verwenden von Virtuellen Uhrwerten

KTM stellt eine virtuelle Uhr für jedes Transaktions-Manager-Objekt zur Verfügung. 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 seinen Protokollstream schreibt, wird der aktuelle Wert der virtuellen Uhr in den Protokolldatensatz eingeschlossen.

Wenn ein Ressourcen-Manager ZwRecoverTransactionManager aufruft, liest KTM Protokolldatenstromdatensätze bis zum Ende des Streams und legt den Wert der virtuellen Uhr des Transaktions-Managers auf den letzten Wert fest, den er im Protokollstream des Objekts findet.

Wenn ein Ressourcen-Manager ZwRollforwardTransactionManager aufruft, liest KTM Protokolldatenstromdatensätze bis zum angegebenen Uhrwert und legt den Virtuellen Uhrwert des Transaktions-Manager-Objekts auf den angegebenen Uhrwert fest.

KTM ermöglicht Es Ressourcen-Managern und übergeordneten Transaktions-Managern, den Virtuellen Uhrwert eines Transaktions-Manager-Objekts zu ändern, aber in der Regel müssen sie den Uhrwert nicht ändern.

Ändern von Werten der virtuellen Uhr

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

Angenommen, Ihr TPS enthält mehrere Ressourcen-Manager, die während der Vorbereitungs-/Vorbereitungs-/Commitsequenz miteinander kommunizieren. Angenommen, jeder Ressourcen-Manager erstellt ein Transaktions-Manager-Objekt, das über einen eindeutigen Protokollstream verfügt. Um sicherzustellen, dass KTM den Zustand aller Ressourcen-Manager während eines Wiederherstellungsvorgang auf denselben Zeitpunkt wiederhergestellt, können diese Ressourcen-Manager die folgenden Schritte ausführen:

  • Wenn ein Ressourcen-Manager mit einem anderen kommuniziert, übergibt er den letzten 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 Virtuellen Uhrwert akzeptiert (siehe den folgenden Abschnitt in diesem Thema), übergibt er den höchsten Uhrwert, den er von KTM oder einem anderen Ressourcen-Manager erhalten hat.

  • Jeder Ressourcen-Manager schreibt Werte der virtuellen Uhr in seinen Protokollstream und verwendet diese Werte, wenn er Rollback- oder Wiederherstellungsvorgänge ausführt.

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

Ändern von Virtuellen Uhrwerten

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

Übergeordnete Transaktions-Manager 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 übergeordneter 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 übergeordneter Transaktions-Manager einen neuen Uhrwert an KTM übergibt, speichert KTM den neuen Wert nur, wenn er größer als der aktuelle Uhrwert ist. Andernfalls behält KTM den aktuellen Uhrwert bei.

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