Erstellen eines Resource Manager

Ressourcenmanager verwalten die Daten jeder Transaktion und protokollieren die Vorgänge der Transaktion. Wenn ein Transaktionsverarbeitungssystem (Transaction Processing System, TPS) über mehrere Ressourcenmanager verfügt, kann jeder Ressourcen-Manager an den Commit-, Rollback- und Wiederherstellungsvorgängen jeder Transaktion teilnehmen.

Jeder Ressourcen-Manager muss eine Schnittstelle exportieren, die Transaktionsclients verwenden können, um auf die Datenbank oder andere Ressource zuzugreifen, die der Ressourcen-Manager verwaltet.

In der Regel muss ein Kernelmodusressourcen-Manager die folgenden Aufgaben in der aufgeführten Reihenfolge ausführen:

  1. Erstellen Sie einen Protokollstream.

    Ressourcenmanager können das Common Log File System (CLFS) oder eine andere Protokollierungsfunktion verwenden, um ihre Protokolldatenströme zu verwalten. Ein Aufruf von ClfsCreateLogFile erstellt einen CLFS-Protokollstream. Der Ressourcen-Manager muss den Protokolldatenstrom verwenden, um alle Informationen aufzuzeichnen, die er zum Commit, Rollback oder Wiederherstellen von Transaktionen benötigt. Darüber hinaus verwendet KTM den Protokolldatenstrom, um alle internen Zustandsänderungen aufzuzeichnen, die möglicherweise zum Wiederherstellen von Transaktionen erforderlich sind.

  2. Erstellen Sie ein Transaktions-Manager-Objekt.

    Ein Aufruf von ZwCreateTransactionManager erstellt ein Transaktions-Manager-Objekt und verbindet den Ressourcen-Manager mit einem zusätzlichen CLFS-Protokollstream, den der Ressourcen-Manager angibt.

  3. Stellen Sie den Status des Transaktions-Managers wieder her.

    Ein Aufruf von ZwRecoverTransactionManager liest den Protokollstream des Transaktions-Manager-Objekts (den KTM verwaltet) und bestimmt, ob das TPS heruntergefahren wurde, bevor alle Transaktionen abgeschlossen wurden (z. B. weil das System abstürzte). KTM stellt seinen internen Zustand basierend auf Informationen im Protokolldatenstrom wieder her.

  4. Erstellen Sie ein Ressourcen-Manager-Objekt.

    Ein Aufruf von ZwCreateResourceManager erstellt ein Ressourcen-Manager-Objekt und ordnet es dem zuvor erstellten Transaktions-Manager-Objekt zu.

  5. Stellen Sie den Ressourcen-Manager-Zustand wieder her.

    Ein Aufruf von ZwRecoverResourceManager bewirkt, dass KTM dem Ressourcen-Manager TRANSACTION_NOTIFY_RECOVER Benachrichtigungen für alle Transaktionen sendet, die beim letzten Herunterfahren des Ressourcen-Managers ausgeführt wurden. Informationen dazu, wie der Ressourcen-Manager auf diese Benachrichtigungen reagieren soll, finden Sie unter Behandeln von Wiederherstellungsvorgängen.

  6. Empfangen von Transaktionen von Clients.

    In der Regel erstellt ein Client ein Transaktionsobjekt und verwendet die Clientschnittstelle des Ressourcen-Managers, um die GUID des Transaktionsobjekts an den Ressourcen-Manager zu übergeben. Der Ressourcen-Manager kann beispielsweise eine CreateDataObject-Routine bereitstellen, die der im Thema Grundlegendes zu TPS-Komponenten beschriebenen Routine ähnelt.

  7. Melden Sie sich bei jeder Transaktion an.

    Ein Aufruf von ZwOpenTransaction öffnet ein Handle für das Transaktionsobjekt, und dann erstellt ein Aufruf von ZwCreateEnlistment eine Enlistment für die Transaktion. Durch die Aufnahme kann der Ressourcen-Manager einen angegebenen Satz von Transaktionsbenachrichtigungen empfangen.

  8. Aktivieren Sie den Empfang von Transaktionsbenachrichtigungen.

    Der Ressourcen-Manager kann ZwGetNotificationResourceManager aufrufen, um Benachrichtigungen synchron abzurufen, oder er kann TmEnableCallbacks aufrufen, um eine ResourceManagerNotification-Rückrufroutine zu registrieren, die KTM aufruft, wenn eine Benachrichtigung verfügbar ist.

  9. Dienstressourcenzugriffsanforderungen von Clients, aber führen Sie die Änderungen nicht dauerhaft aus.

    Nachdem ein Client ein Transaktionsobjekt erstellt hat, ruft er in der Regel die Schnittstelle des Ressourcen-Managers auf, um auf die Ressource des Ressourcen-Managers zuzugreifen. Beispielsweise kann ein Ressourcen-Manager für eine Datenbank Anforderungen zum Lesen aus der Datenbank und zum Schreiben in die Datenbank empfangen.

    Der Ressourcen-Manager muss die Ergebnisse der Lese- und Schreibvorgänge in einem CLFS-Protokolldatenstrom oder einer anderen Protokollierungsfunktion aufzeichnen, bis er eine Benachrichtigung erhält, dass die Vorgänge der Transaktion committet, zurückgesetzt oder wiederhergestellt werden.

  10. Committen oder Rollback von Clientvorgängen.

    Schließlich erhält der Ressourcen-Manager eine Benachrichtigung, um mit dem Commit oder Rollback der vom Client ausgeführten Vorgänge zu beginnen. Als Reaktion muss der Ressourcen-Manager die Clientvorgänge entweder dauerhaft festlegen oder verwerfen. Weitere Informationen zum Behandeln von Commit- und Rollbackbenachrichtigungen finden Sie unter Behandeln von Transaktionsvorgängen.

    Gelegentlich muss ein Ressourcen-Manager möglicherweise versuchen, KTM zu zwingen, schnell eine Commit- oder Rollbackbenachrichtigung bereitzustellen, möglicherweise weil der Ressourcen-Manager festgestellt hat, dass ein Gerät überraschend entfernt wurde. In einem solchen Fall kann der Ressourcen-Manager TmRequestOutcomeEnlistment aufrufen.

  11. Schließen Sie das Handle des Einlistungsobjekts.

    Nachdem der Ressourcen-Manager die Verarbeitung der Transaktion abgeschlossen hat, muss er ZwClose aufrufen, um das Handle des Einlistungsobjekts zu schließen.

  12. Schließen Sie das Resource Manager-Objekthandle und das Transaktions-Manager-Objekthandle.

    Bevor der Ressourcen-Manager entladen wird, muss er ZwClose aufrufen, um das Handle des Ressourcen-Manager-Objekts und das Handle des Transaktions-Manager-Objekts zu schließen.

Die Schritte 1 bis 5 müssen im Initialisierungscode Ihres Ressourcen-Managers ausgeführt werden. Wenn Ihr Ressourcen-Manager beispielsweise ein Kernelmodustreiber ist, ist der Initialisierungscode die DriverEntry-Routine des Treibers.

Die Schritte 6 bis 11 werden in der Regel in Code ausgeführt, der auf Anforderungen von Transaktionsclients antwortet.

Schritt 12 muss im endgültigen sauber-Up-Code Ihres Ressourcen-Managers ausgeführt werden, z. B. in der Entladeroutine eines Kernelmodustreibers.

Erstellen einer Read-Only Enlistment

Eine schreibgeschützte Einlistung ist eine Aufnahme, die keine Benachrichtigungen von KTM erhält. Ein Ressourcen-Manager kann jede Einlistung schreibgeschützt machen, indem er ZwReadOnlyEnlistment aufruft. Dieser Aufruf bewirkt, dass KTM keine Benachrichtigungen mehr an den Ressourcen-Manager liefert.

Nachdem Ihr Ressourcen-Manager ZwCreateEnlistment aufgerufen hat, kann er ZwReadOnlyEnlistment jederzeit bis zu dem Punkt aufrufen, an dem er normalerweise ZwPrepareComplete aufrufen würde.

Es gibt zwei Gründe, warum Ihr Ressourcenmanager ZwReadOnlyEnlistment aufrufen soll.

  • Ihr Ressourcen-Manager hat an einer Transaktion teilgenommen, und irgendwann, bevor er eine TRANSACTION_NOTIFY_COMMIT Benachrichtigung erhält, stellt der Ressourcenmanager fest, dass er nicht mehr am Commitvorgang der Transaktion teilnehmen muss.

    Wenn der Ressourcen-Manager beispielsweise eine TRANSACTION_NOTIFY_PREPARE Benachrichtigung empfängt, kann er feststellen, dass keiner der Vorgänge der Transaktion die Datenbank des Ressourcen-Managers geändert hat. Der Ressourcen-Manager kann ZwReadOnlyEnlistment anstelle von ZwPrepareComplete aufrufen, um sich selbst aus der Transaktion zu entfernen.

  • Ihr Ressourcen-Manager nimmt nie am Commitvorgang einer Transaktion teil.

    Beispielsweise kann Ihr Ressourcen-Manager daten überwachen, die der Client sendet, ohne die gespeicherte Datenbank zu ändern. In diesem Fall kann Ihr Ressourcen-Manager ZwReadOnlyEnlistment sofort aufrufen, nachdem er ZwCreateEnlistment aufgerufen hat. Darüber hinaus können Sie einen solchen Ressourcen-Manager wie im nächsten Abschnitt dieses Themas beschrieben als unveränderlich festlegen.

Nachdem ein Ressourcen-Manager ZwReadOnlyEnlistment aufgerufen hat, kann er ZwClose aufrufen, um das Enlistment-Handle zu schließen.

Erstellen eines Volatile-Resource-Managers

Ein Manager für flüchtige Ressourcen ist ein Ressourcen-Manager, der keine dauerhaften Daten verwaltet. Beispielsweise können Sie einen Volatile-Resource-Manager erstellen, um daten zu überwachen, die der Client sendet, wenn der Ressourcen-Manager eine dauerhaft gespeicherte Datenbank nicht ändert. Manager für flüchtige Ressourcen protokollieren in der Regel keine Transaktionsaktivitäten und können daher keine Wiederherstellungs- oder Rollbackvorgänge ausführen.

Ein Manager für flüchtige Ressourcen muss das flag RESOURCE_MANAGER_VOLATILE festlegen, wenn er ZwCreateResourceManager aufruft. Wenn dieses Flag festgelegt ist, protokolliert KTM keine Informationen zum Ressourcen-Manager im Protokollstream des zugeordneten Transaktions-Manager-Objekts.

Ihr Ressourcen-Manager kann auch ein TRANSACTION_MANAGER_VOLATILE-Flag festlegen, wenn er ZwCreateTransactionManager aufruft. Wenn dieses Flag festgelegt ist, erstellt KTM keinen Protokolldatenstrom für das Transaktions-Manager-Objekt. Darüber hinaus müssen alle zusätzlichen Ressourcenmanager, die mit dem Transaktions-Manager-Objekt verbunden sind, ebenfalls volatil sein und das flag RESOURCE_MANAGER_VOLATILE festlegen.

Hinzufügen eines Resource Manager zu einem vorhandenen TPS

Wenn Sie einem vorhandenen TPS einen zusätzlichen Ressourcen-Manager hinzufügen müssen, haben Sie zwei Möglichkeiten:

  • Ihr neuer Ressourcen-Manager ruft ZwCreateTransactionManager auf, um ein eigenes Transaktions-Manager-Objekt zu erstellen.

    Verwenden Sie diese Wahl, wenn Ihr Ressourcen-Manager nicht mit anderen Ressourcenmanagern im TPS kommuniziert.

  • Ihr neuer Ressourcen-Manager ruft ZwOpenTransactionManager auf, um eine Verbindung mit einem vorhandenen Transaktions-Manager-Objekt herzustellen.

    Verwenden Sie diese Wahl, wenn Ihr Ressourcen-Manager mit anderen Ressourcenmanagern im TPS kommunizieren muss. Der Ressourcen-Manager, der ZwCreateTransactionManager aufruft, muss die GUID, den Protokolldatenstromnamen oder den Objektnamen des Transaktions-Manager-Objekts freigeben, damit andere Ressourcenmanager ZwOpenTransactionManager aufrufen können. Diese anderen Ressourcen-Manager können ZwQueryInformationTransactionManager aufrufen, um zusätzliche Informationen zum Transaktions-Manager-Objekt abzurufen.

Nachdem Sie Ihren Ressourcen-Manager dem TPS hinzugefügt haben, können Clients, die ihren Ressourcen-Manager kennen, die Clientschnittstelle des Ressourcen-Managers aufrufen.