Erstellen eines überlegenen Transaktions-Managers
In KTM ist ein überlegener Transaktions-Manager ein Ressourcen-Manager, der überlegene Listen für die Transaktionen erstellt, an denen er beteiligt ist. Eine übergeordnete Eintragsliste ist ein Eintrag, der dem Ressourcen-Manager die Möglichkeit gibt, den Commitvorgang für die Transaktion der Einlistung zu koordinieren. Anders ausgedrückt: Entweder ein Transaktionsclient oder der übergeordnete Transaktions-Manager kann die Vorbereitungs-,Vorbereitungs-/Commitsequenz für die Transaktion starten.
Nachdem ein Ressourcen-Manager eine übergeordnete Eintragsliste für eine Transaktion erstellt hat, lehnt KTM alle Aufrufe von ZwCommitTransaction für die Transaktion ab. Daher können Transaktionsclients eine solche Transaktion nicht committen. Stattdessen muss der Ressourcen-Manager, der die übergeordnete Eintragsliste erstellt hat, ZwPrePrepareEnlistment, ZwPrepareEnlistment und ZwCommitEnlistment aufrufen.
Wann sollte ein höherer Transaktions-Manager erstellt werden?
Angenommen, Sie möchten eine TPS-Komponente (Transaction Processing System) in KTM integrieren, die Komponente enthält jedoch eigene Nicht-KTM-Transaktionsverwaltungsfunktionen, die Clients aufrufen können. In einer solchen Situation müssen Sie möglicherweise einen überlegenen Transaktions-Manager erstellen.
Angenommen, Ihre Komponente stellt eigene Schnittstellen bereit, die Clients zum Erstellen und Committen von Transaktionen verwenden. Da die Clients Ihrer Komponente ktm nicht aufrufen, um Transaktionen zu erstellen oder zu committen, muss Ihre Komponente ein überlegener Transaktions-Manager werden, wenn Sie sie in ein KTM-basiertes TPS integrieren.
Erstellen eines überlegenen Transaktions-Managers
Wenn Ihre Komponente ein überlegener Transaktions-Manager sein soll, muss sie die folgenden Schritte ausführen:
Rufen Sie ZwCreateResourceManager auf, um sich als Ressourcen-Manager zu registrieren.
Rufen Sie ZwCreateTransaction jedes Mal auf, wenn ein Client Ihrer Komponente eine Transaktion über die Clientschnittstelle Ihrer Komponente erstellt.
Rufen Sie ZwCreateEnlistment auf, legen Sie das flag ENLISTMENT_SUPERIOR fest, und geben Sie sowohl die ENLISTMENT_SUPERIOR_RIGHTS- als auch ENLISTMENT_SUBORDINATE_RIGHTS-Zugriffsflags an.
Rufen Sie ZwPrePrepareEnlistment, ZwPrepareEnlistment und ZwCommitEnlistment auf, wenn der Client Ihrer Komponente die Clientschnittstelle Ihrer Komponente aufruft, um die Transaktion zu committen.
KTM lässt pro Transaktion nur eine übergeordnete Einlistung zu. Andere Ressourcenmanager können zusätzliche Eintrage erstellen. Diese Einlistungen werden als untergeordnete Eintrage bezeichnet, da sie den Commitvorgang nicht initiieren können.
Um ein Rollback für eine übergeordnete Liste durchzuführen, ruft Ihr übergeordneter Transaktions-Manager ZwRollbackEnlistment auf.
Um eine übergeordnete Eintragsliste wiederherzustellen, ruft Ihr übergeordneter Transaktions-Manager ZwRecoverEnlistment auf.
Wenn ein überlegener Transaktions-Manager eine Transaktion committet, ein Rollback ausführt oder wiederhergestellt, sendet KTM Transaktionsbenachrichtigungen an alle untergeordneten Listen, damit diese teilnehmen können.
Ein TPS, das einen überlegenen Transaktions-Manager enthält, kann keine einstufigen Commitvorgänge verwenden.
Wenn KTM während eines Wiederherstellungsvorgangs das Ergebnis einer Transaktion nicht ermitteln kann, sendet es eine TRANSACTION_NOTIFY_RECOVER_QUERY Benachrichtigung an den übergeordneten Transaktions-Manager. Als Reaktion darauf muss der übergeordnete Transaktions-Manager ZwCommitEnlistment aufrufen, wenn für die Transaktion ein Commit ausgeführt werden kann, oder ZwRollbackEnlistment , wenn für die Transaktion ein Rollback ausgeführt werden soll. Wenn der übergeordnete Transaktionsmanager das Ergebnis einer Transaktion nicht ermitteln kann, sollte er erst auf die TRANSACTION_NOTIFY_RECOVER_QUERY Benachrichtigung reagieren, bis er ein Ergebnis bestimmen kann.