Erstellen eines Resource Manager
Ressourcen-Manager verwalten die Daten jeder Transaktion und protokollieren die Vorgänge der Transaktion. Wenn ein Transaktionsverarbeitungssystem (TPS) über mehrere Ressourcen-Manager verfügt, kann jeder Ressourcen-Manager an den Commit-, Rollback- und Wiederherstellungsvorgängen jeder Transaktion teilnehmen.
Jeder Ressourcen-Manager muss eine Schnittstelle exportieren, über die Transaktionsclients auf die Datenbank oder andere Ressourcen zugreifen können, die der Ressourcen-Manager verwaltet.
In der Regel muss ein Ressourcen-Manager im Kernelmodus die folgenden Aufgaben in der aufgeführten Reihenfolge ausführen:
Erstellen Sie einen Protokolldatenstrom.
Ressourcen-Manager können die Gemeinsames Protokolldateisystem (CLFS) oder eine andere Protokollierungsfunktion verwenden, um ihre Protokolldatenströme zu verwalten. Durch einen Aufruf von ClfsCreateLogFile wird ein CLFS-Protokollstream erstellt. Der Ressourcen-Manager muss den Protokolldatenstrom verwenden, um alle Informationen zu erfassen, die er zum Durchführen eines Commits, Rollbacks oder Wiederherstellens von Transaktionen benötigt. Darüber hinaus verwendet KTM den Protokolldatenstrom, um alle internen Zustandsänderungen zu erfassen, die möglicherweise zum Wiederherstellen von Transaktionen erforderlich sind.
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.
Wiederherstellen des Transaktions-Manager-Zustands.
Ein Aufruf von ZwRecoverTransactionManager liest den Protokolldatenstrom des Transaktions-Manager-Objekts (der von KTM verwaltet wird) und bestimmt, ob der TPS heruntergefahren wurde, bevor alle Transaktionen abgeschlossen wurden (z. B. weil das System abgestürzt ist). KTM stellt seinen internen Zustand basierend auf Informationen im Protokollstream wieder auf.
Erstellen Sie ein Resource Manager-Objekt.
Ein Aufruf von ZwCreateResourceManager erstellt ein Resource Manager-Objekt und ordnet es dem zuvor erstellten Transaktions-Manager-Objekt zu.
Wiederherstellen des Resource Manager-Zustands.
Ein Aufruf von ZwRecoverResourceManager bewirkt, dass KTM den Ressourcen-Manager TRANSACTION_NOTIFY_RECOVER-Benachrichtigungen für alle Transaktionen sendet, die beim letzten Herunterfahren des Ressourcen-Managers in Bearbeitung waren. Informationen dazu, wie der Ressourcen-Manager auf diese Benachrichtigungen reagieren soll, finden Sie unter Behandeln von Wiederherstellungsvorgängen.
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. Beispielsweise kann der Ressourcen-Manager eine CreateDataObject-Routine bereitstellen, die der im Thema Understanding TPS Components (Grundlegendes zu TPS-Komponenten) beschriebenen Ähnelt.
Eintragung in jede Transaktion.
Ein Aufruf von ZwOpenTransaction öffnet ein Handle für das Transaktionsobjekt, und dann erstellt ein Aufruf von ZwCreateEnlistment eine Eintragung für die Transaktion. Mit der Eintragung kann der Ressourcen-Manager einen angegebenen Satz von Transaktionsbenachrichtigungen empfangen.
Aktivieren sie den Empfang von Transaktionsbenachrichtigungen.
Der Ressourcen-Manager kann ZwGetNotificationResourceManager aufrufen, um synchron Benachrichtigungen zu erhalten, oder TmEnableCallbacks aufrufen, um eine ResourceManagerNotification-Rückrufroutine zu registrieren, die KTM aufruft, wenn eine Benachrichtigung verfügbar ist.
Dienstressourcenzugriffsanforderungen von Clients, aber machen Sie die Änderungen nicht dauerhaft.
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 zu zugreifen. Beispielsweise kann ein Ressourcen-Manager für eine Datenbank Anforderungen zum Lesen und Schreiben in die Datenbank empfangen.
Der Ressourcen-Manager muss die Ergebnisse der Lese- und Schreibvorgänge in einem CLFS-Protokollstream oder einer anderen Protokollierungsfunktion aufzeichnen, bis er eine Benachrichtigung erhält, dass für die Vorgänge der Transaktion ein Committed ausgeführt, ein Rollback ausgeführt oder wiederhergestellt wird.
Commit oder Rollback von Clientvorgängen.
Schließlich erhält der Ressourcen-Manager eine Benachrichtigung, um mit dem Committen oder Roll back der vom Client ausgeführten Vorgänge zu beginnen. Als Antwort muss der Ressourcen-Manager die Clientvorgänge entweder dauerhaft machen oder verwerfen. Weitere Informationen zum Behandeln von Commit- und Rollbackbenachrichtigungen finden Sie unter Behandeln von Transaktionsvorgängen.
Gelegentlich muss ein Ressourcen-Manager versuchen, KTM zu zwingen, schnell eine Commit- oder Rollbackbenachrichtigung zu senden, möglicherweise weil der Ressourcen-Manager festgestellt hat, dass ein Gerät überraschend entfernt wurde. In diesem Fall kann der Ressourcen-Manager TmRequestOutcomeEnlistment aufrufen.
Schließen Sie das Enlistment-Objekthand handle.
Nachdem der Ressourcen-Manager die Verarbeitung der Transaktion abgeschlossen hat, muss er ZwClose aufrufen , um das Handle des Eintragungsobjekts zu schließen.
Schließen Sie das Resource Manager-Objekthand handle und das Transaktions-Manager-Objekthand handle.
Bevor der Ressourcen-Manager entladen wird, muss er ZwClose aufrufen, um das Handle des Resource 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 reagiert.
Schritt 12 muss im endgültigen Bereinigungscode Ihres Ressourcen-Managers ausgeführt werden, z. B. in der Unload-Routine eines Kernelmodustreibers .
Erstellen einer Read-Only Eintragung
Eine schreibgeschützte Eintragung ist eine Eintragung, die keine Benachrichtigungen von KTM erhält. Ein Ressourcen-Manager kann jede Eintragung schreibgeschützt machen, indem er ZwReadOnlyEnlistment aufruft. Dieser Aufruf bewirkt, dass KTM keine Benachrichtigungen mehr an den Ressourcen-Manager übersendet.
Nachdem Ihr Ressourcen-Manager ZwCreateEnlistment aufgerufen hat, kann er ZwReadOnlyEnlistment jederzeit bis zu dem Punkt aufrufen, an dem ZwPrepareComplete normalerweise aufgerufen wird.
Es gibt zwei Gründe, warum Ihr Ressourcen-Manager ZwReadOnlyEnlistment aufrufen soll.
Ihr Ressourcen-Manager war an einer Transaktion beteiligt, und zu einem bestimmten Zeitpunkt, bevor er eine TRANSACTION_NOTIFY_COMMIT-Benachrichtigung empfängt, stellt der Ressourcen-Manager fest, dass er nicht mehr am Commitvorgang der Transaktion teilnehmen muss.
Wenn der Ressourcen-Manager beispielsweise eine TRANSACTION_NOTIFY_PREPARE 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 an einem Commitvorgang einer Transaktion teil.
Ihr Ressourcen-Manager kann z. B. daten, die der Client sendet, überwachen, ohne eine 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 als flüchtig festlegen, wie im nächsten Abschnitt dieses Themas beschrieben.
Nachdem ein Ressourcen-Manager ZwReadOnlyEnlistment aufgerufen hat, kann er ZwClose aufrufen, um das Eintragungshandles zu schließen.
Erstellen eines Volatile-Resource Managers
Ein flüchtiger Ressourcen-Manager ist ein Ressourcen-Manager, der keine dauerhaften Daten verwaltet. Beispielsweise können Sie einen flüchtigen Ressourcen-Manager erstellen, um daten zu überwachen, die der Client sendet, wenn der Ressourcen-Manager keine dauerhaft gespeicherte Datenbank ä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 flüchtiger Ressourcen-Manager muss das 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 festlegen, wenn er ZwCreateTransactionManager aufruft. Wenn dieses Flag festgelegt ist, erstellt KTM keinen Protokollstream für das Transaktions-Manager-Objekt. Darüber hinaus müssen alle zusätzlichen Ressourcen-Manager, die mit dem Transaktions-Manager-Objekt verbunden sind, ebenfalls flüchtig sein und das 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 Option, wenn Ihr Ressourcen-Manager nicht mit anderen Ressourcen-Managern im TPS kommuniziert.
Ihr neuer Ressourcen-Manager ruft ZwOpenTransactionManager auf, um eine Verbindung mit einem vorhandenen Transaktions-Manager-Objekt herzustellen.
Verwenden Sie diese Option, wenn Ihr Ressourcen-Manager mit anderen Ressourcen-Managern 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 Ressourcen-Manager 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.