Erstellen eines Transaktionsclients

Ein Transaktionsclient ist eine TPS-Komponente (Transaction Processing System), die die exportierte Schnittstelle eines Ressourcen-Managers verwendet, um auf eine Ressource wie eine Datenbank zuzugreifen, die der Ressourcen-Manager unterstützt.

In der Regel erstellt der Client eine Transaktion, führt eine Reihe von Datenbankvorgängen aus und committ dann die Transaktion, um die Vorgänge dauerhaft zu machen. Wenn beim Client ein Fehler auftritt, kann ein Rollback für die Transaktion durchgeführt werden, um die Vorgänge der Transaktion zu entfernen, anstatt die Transaktion zu committen.

In der Regel muss ein Transaktionsclient, der KTM im Kernelmodus verwendet, die folgenden Aufgaben für jede Transaktion ausführen:

  1. Erstellen Sie ein Transaktionsobjekt.

    Ein Aufruf von ZwCreateTransaction erstellt ein Transaktionsobjekt, stellt ein Objekthandle bereit und weist einen Objektbezeichner (eine GUID) zu, den der Client an den Ressourcen-Manager übergeben kann, um die Transaktion zu identifizieren.

  2. Rufen Sie den Bezeichner des Transaktionsobjekts ab.

    Der Client kann ZwQueryInformationTransaction aufrufen, um den Objektbezeichner abzurufen.

  3. Übergeben Sie den Bezeichner des Transaktionsobjekts an einen Ressourcen-Manager.

    Der Client ruft in der Regel die exportierte Schnittstelle des Ressourcen-Managers auf, um einen Kommunikationspfad zum Ressourcen-Manager zu öffnen und den Pfad der Transaktion zuzuordnen. Der Ressourcen-Manager kann beispielsweise eine CreateDataObject-Routine bereitstellen, die der im Thema Grundlegendes zu TPS-Komponenten beschriebenen Routine ähnelt.

  4. Führen Sie Vorgänge aus, die in die Transaktion einbezogen werden sollen.

    In der Regel ruft der Client die Schnittstelle des Ressourcen-Managers auf, um auf die Ressource des Ressourcen-Managers zuzugreifen. Beispielsweise kann der Client eines Datenbank-Managers aus der Datenbank lesen und in die Datenbank schreiben.

  5. Commit oder Rollback der Transaktion.

    Wenn alle Ressourcenvorgänge erfolgreich sind, muss der Client ZwCommitTransaction aufrufen, um die Vorgänge dauerhaft zu machen. Wenn ein Vorgang fehlschlägt, muss der Client ZwRollbackTransaction anstelle von ZwCommitTransaction aufrufen. Wenn der Client eines Datenbank-Managers beispielsweise feststellt, dass bei einer Reihe von Schreibvorgängen ein Fehler aufgetreten ist, muss der Client ZwRollbackTransaction aufrufen, damit keiner der Schreibvorgänge dauerhaft wird.

    Clients können ZwCommitTransaction und ZwRollbackTransaction entweder synchron oder asynchron aufrufen. Wenn Clients diese Routinen synchron aufrufen, werden die Routinen erst zurückgegeben, wenn der Commit- oder Rollbackvorgang abgeschlossen ist.

    Weitere Informationen zum Commit und Rollback von Transaktionen finden Sie unter Behandeln von Transaktionsvorgängen.

  6. Schließen Sie das Transaktionsobjekthandle.

    Nachdem der Client die Verarbeitung der Transaktion abgeschlossen hat, muss er ZwClose aufrufen, um das Handle des Transaktionsobjekts zu schließen.

Ein TPS kann mehrere Ressourcen-Manager enthalten. Wenn die Transaktion eines Clients Vorgänge für mehrere Ressourcen enthält, z. B. zwei Datenbanken, die von zwei Ressourcenmanagern unterstützt werden, führt der Client in der Regel folgendes aus:

  1. Erstellt ein einzelnes Transaktionsobjekt für jede Transaktion.

  2. Übergibt den Bezeichner des Transaktionsobjekts an jeden Ressourcen-Manager.

  3. Führt Vorgänge für jede Datenbank durch Aufrufen der Schnittstelle jedes Ressourcen-Managers aus.

  4. Committ die Transaktion, wenn alle Vorgänge ohne Fehler abgeschlossen wurden, oder führt ein Rollback für die Transaktion aus, wenn ein Fehler erkannt wurde.

Wenn Ihr TPS einen überlegenen Transaktions-Manager enthält, rufen Transaktionsclients in der Regel nicht KTM auf. Weitere Informationen zu überlegenen Transaktionsmanagern und ihren Clients finden Sie unter Erstellen eines übergeordneten Transaktions-Managers.

Transaktionsclients können ZwSetInformationTransaction aufrufen, um transaktionsspezifische Informationen festzulegen. Ein Client kann beispielsweise einen Timeoutwert für die Transaktion festlegen oder eine beschreibende Zeichenfolge angeben. Clients können ZwQueryInformationTransaction aufrufen, um Informationen zu einer Transaktion abzurufen. Beispielsweise kann ein Client diese Routine aufrufen, um zu bestimmen, ob eine Transaktion committet oder ein Rollback ausgeführt wurde.