Freigeben über


Behandeln von Commitvorgängen

Es gibt zwei Arten von Commitvorgängen: Einphasige Commits und Mehrphasencommit. Ein Einphasencommitvorgang besteht aus einer einzelnen Benachrichtigung, auf die Ressourcenmanager reagieren müssen, während ein Mehrphasencommitvorgang zusätzliche Benachrichtigungen für Vorbereitungsschritte enthält.

Ein einstufiger Commitvorgang ist einfacher zu implementieren. Es eignet sich für Transaktionsverarbeitungssysteme (TPSs), die eines der folgenden Merkmale aufweisen:

  • Ein einzelner Ressourcenmanager.

  • Mehrere Ressourcen-Manager, von denen alle bis auf einen schreibgeschützt sind und nicht am Commitvorgang teilnehmen.

Ein Mehrphasencommitvorgang ist erforderlich, wenn mehrere Ressourcenmanager am Commitvorgang teilnehmen.

Single-Phase Commitvorgänge

Wenn Ihr TPS einphasige Commitvorgänge unterstützen soll, muss sich ein (und nur ein) Ressourcen-Manager registrieren, um TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT Benachrichtigungen für seine Einlistungen zu erhalten. Alle anderen Ressourcenmanager müssen schreibgeschützt sein.

Ein TPS, der einen überlegenen Transaktions-Manager enthält, kann keinen Einphasencommit verwenden.

Wenn ein Ressourcen-Manager registriert ist, um TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT Benachrichtigungen zu erhalten, sendet KTM diese Art von Benachrichtigung, wenn ein Transaktionsclient ZwCommitTransaction aufruft.

Wenn der Ressourcen-Manager eine TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT Benachrichtigung für eine Transaktion empfängt, kann er entweder einen Commit für die Transaktion oder einen einphasigen Commit ablehnen.

Um die Transaktion zu committen, muss der Ressourcen-Manager Folgendes tun:

  1. Leeren Sie alle Daten, die sie in einem nicht permanenten Cache (In-Memory-Speicher) enthält, z. B. den CLFS-Marshallbereich für einen CLFS-Protokollstream.

    Der Ressourcen-Manager muss die Daten aus dem Cache auf ein dauerhaftes Speichermedium verschieben. Ein Ressourcen-Manager, der CLFS verwendet, kann beispielsweise ClfsFlushBuffers aufrufen.

  2. Machen Sie alle Datenänderungen dauerhaft und öffentlich (d. a. außerhalb des Bereichs des Ressourcen-Managers sichtbar).

  3. Rufen Sie ZwCommitComplete auf.

Nach dem Aufruf von ZwCommitComplete sollte der Ressourcen-Manager ZwClose aufrufen, um das Enlistment-Handle zu schließen.

Um einen einphasigen Commitvorgang für die Transaktion abzulehnen, kann der Ressourcen-Manager ZwSinglePhaseReject aufrufen. Wenn der Ressourcen-Manager ZwSinglePhaseReject aufruft, ändert KTM sofort den Commitvorgang von einphasig in mehrphasig.

Wenn sich andere Ressourcenmanager für dieselbe Transaktion anmelden, müssen sie schreibgeschützt sein. Sie müssen sich jedoch registrieren, um die TRANSACTION_NOTIFY_RM_DISCONNECTED Benachrichtigung zu erhalten, die sie erhalten, wenn der Ressourcen-Manager, der den einphasigen Commitvorgang verarbeitet, das Enlistment-Handle schließt, ohne anzugeben, dass die Transaktion zu einem Commit oder rollback ausgeführt wurde.

Mehrphasige Commitvorgänge

Ein Commitvorgang mit mehreren Phasen beginnt, wenn eines der folgenden Ereignisse auftritt:

Mehrphasige Commitvorgänge bestehen aus drei sequenziellen Phasen: Pre-Prepare, Prepare und Commit.

Vorbereitungsphase

Die Vorbereitungsphase (auch als Phase 0 bezeichnet) des Commitvorgangs beginnt, wenn KTM eine TRANSACTION_NOTIFY_PREPREPARE Benachrichtigung an alle Ressourcenmanager sendet. KTM sendet diese Benachrichtigung, wenn kein Ressourcenmanager einen einphasigen Commitvorgang für die Transaktion unterstützt oder wenn ein überlegener Transaktionsmanager ZwPrePrepareEnlistment aufruft.

Wenn jeder Ressourcen-Manager die TRANSACTION_NOTIFY_PREPREPARE-Benachrichtigung empfängt, muss er folgendes tun:

  1. Leeren Sie alle Daten, die sie in einem nicht permanenten Cache (In-Memory-Speicher) enthält, z. B. den CLFS-Marshallbereich für einen CLFS-Protokollstream.

    Der Ressourcen-Manager muss die Daten aus dem Cache auf ein dauerhaftes Speichermedium verschieben. Ein Ressourcen-Manager, der CLFS verwendet, kann beispielsweise ClfsFlushBuffers aufrufen.

  2. Rufen Sie ZwPrePrepareComplete auf.

Nachdem ein Ressourcen-Manager ZwPreprepareComplete aufgerufen hat, kann er weiterhin Clientanforderungen empfangen und verwalten. Der Ressourcen-Manager muss jedoch alle Datenänderungen als Cache-Passthroughvorgänge behandeln, die sofort auf ein dauerhaftes Speichermedium geschrieben werden.

Wenn ein Ressourcen-Manager bei der Verarbeitung einer TRANSACTION_NOTIFY_PREPREPARE Benachrichtigung auf einen Fehler stößt, sollte er ZwRollbackEnlistment aufrufen, um ein Rollback für die Transaktion auszuführen.

Vorbereitungsphase

Die Vorbereitungsphase (auch bekannt als Phase 1) des Commitvorgangs beginnt, wenn KTM eine TRANSACTION_NOTIFY_PREPARE Benachrichtigung an alle Ressourcenmanager sendet. KTM sendet diese Benachrichtigung nach TRANSACTION_NOTIFY_PREPREPARE, wenn keine Ressourcenmanager einen einphasigen Commit unterstützen oder wenn ein überlegener Transaktionsmanager ZwPrepareEnlistment aufruft.

Wenn jeder Ressourcen-Manager die TRANSACTION_NOTIFY_PREPARE Benachrichtigung empfängt, muss er Folgendes tun:

  1. Beenden Sie die Wartung von Clientanforderungen, und melden Sie alle nachfolgenden Clientanforderungen als Clientfehler.

  2. Stellen Sie sicher, dass alle Daten in dauerhaften Speicher verschoben wurden.

  3. Rufen Sie ZwPrepareComplete auf.

Wenn bei einem Ressourcen-Manager bei der Verarbeitung einer TRANSACTION_NOTIFY_PREPARE Benachrichtigung ein Fehler auftritt, sollte er ZwRollbackEnlistment aufrufen, um ein Rollback für die Transaktion auszuführen. Der Ressourcen-Manager kann jedoch kein Rollback für die Transaktion ausführen, nachdem er ZwPrepareComplete aufgerufen hat.

Commitphase

Die Commitphase (auch als Phase 2 bezeichnet) des Commitvorgangs beginnt, wenn KTM eine TRANSACTION_NOTIFY_COMMIT Benachrichtigung an alle Ressourcenmanager sendet. KTM sendet diese Benachrichtigung nach TRANSACTION_NOTIFY_PREPARE, wenn keine Ressourcenmanager einen single-phase Commit unterstützen oder wenn ein überlegener Transaktionsmanager ZwCommitEnlistment aufruft.

Wenn jeder Ressourcenmanager die TRANSACTION_NOTIFY_COMMIT-Benachrichtigung empfängt, muss er folgendes tun:

  1. Machen Sie alle Datenänderungen dauerhaft und öffentlich (d. a. für andere Transaktionen sichtbar).

    In der Regel macht ein Ressourcen-Manager Änderungen dauerhaft und öffentlich, indem er die gespeicherten Daten der Transaktion aus dem Protokolldatenstrom in den öffentlichen, permanenten Speicher der Datenbank kopiert. Weitere Informationen zur Verwendung von Protokollstreams finden Sie unter Verwenden von Protokollstreams mit KTM.

  2. Rufen Sie ZwCommitComplete auf.

Nachdem der Ressourcen-Manager ZwCommitComplete aufgerufen hat, sollte er ZwClose aufrufen, um das Enlistment-Handle zu schließen.

Wenn bei einem Ressourcen-Manager während der Verarbeitung einer TRANSACTION_NOTIFY_COMMIT Benachrichtigung ein Fehler auftritt, sollte er sich selbst herunterfahren. Wenn das Betriebssystem den Ressourcen-Manager das nächste Mal neu lädt, sollte der Wiederherstellungsprozess des Ressourcen-Managers die Transaktion in einen Zustand wiederherstellen, der vor dem Auftreten des Fehlers als gut bekannt war.