Freigeben über


Implementieren eines Ressourcen-Managers

Jede ressource, die in einer Transaktion verwendet wird, wird von einem Ressourcenmanager verwaltet, dessen Aktionen von einem Transaktionsmanager koordiniert werden. Ressourcenmanager arbeiten in Zusammenarbeit mit dem Transaktionsmanager zusammen, um der Anwendung eine Garantie für Atomität und Isolation zu bieten. Microsoft SQL Server, dauerhafte Nachrichtenwarteschlangen, Speicherhashtabellen sind alle Beispiele für Ressourcenmanager.

Ein Ressourcenmanager verwaltet dauerhafte oder veränderliche Daten. Die Haltbarkeit (oder umgekehrt die Volatilität) eines Ressourcenmanagers bezieht sich darauf, ob der Ressourcenmanager fehlerwiederherstellung unterstützt. Wenn ein RM die Wiederherstellung nach einem Fehler unterstützt, legt er Daten während Phase1 (Vorbereitung) in einem permanenten Speicher ab, damit er sich im Falle eines Ausfalls nach der Wiederherstellung erneut in die Transaktion eintragen und entsprechend den Benachrichtigungen des TM geeignete Aktionen ausführen kann. Im Allgemeinen verwalten flüchtige Ressourcenmanager flüchtige Ressourcen wie z. B. eine In-Memory-Datenstruktur (z. B. eine in-Memory-Transacted-Hashtable), und dauerhafte Ressourcenmanager verwalten Ressourcen, die über einen beständigeren persistenten Speicher verfügen (z. B. eine Datenbank, deren Speicher auf einer Festplatte basiert).

Damit eine Ressource an einer Transaktion teilnimmt, muss sie sich in der Transaktion anmelden. Die Transaction Klasse definiert eine Reihe von Methoden, deren Namen mit Enlist beginnen und die diese Funktionalität bereitstellen. Die verschiedenen Enlist Methoden entsprechen den verschiedenen Typen der Einbindung, die ein Ressourcenmanager haben kann. Insbesondere verwenden Sie die EnlistVolatile Methoden für veränderliche Ressourcen und die EnlistDurable Methode für dauerhafte Ressourcen. Aus Gründen der Einfachheit sollten Sie, nachdem Sie entschieden haben, ob Sie die Methode EnlistDurable oder EnlistVolatile basierend auf der Haltbarkeitsunterstützung Ihrer Ressource verwenden, Ihre Ressource anmelden, um am Two Phase Commit (2PC) teilzunehmen, indem Sie die IEnlistmentNotification Schnittstelle für Ihren Ressourcen-Manager implementieren. Weitere Informationen zu 2PC finden Sie unter Ausführen eines Einphasen- oder Mehrphasencommits für eine Transaktion.

Durch die Registrierung stellt der Ressourcenmanager sicher, dass er Rückmeldungen vom Transaktionsmanager erhält, wenn die Transaktion bestätigt oder abgebrochen wird. Es gibt eine Instanz von IEnlistmentNotification pro Eintragung. In der Regel gibt es eine Eintragung pro Transaktion, aber ein Ressourcenmanager kann sich in der gleichen Transaktion mehrfach eintragen.

Nach der Eintragung antwortet der Ressourcenmanager auf die Anforderungen der Transaktion. Ein dauerhafter RM speichert genügend Informationen, um die Änderungen einer Transaktion an den vom RM verwalteten Ressourcen rückgängig zu machen oder zu wiederholen. Es gibt viele Möglichkeiten, dies zu tun; Das Beibehalten von Datenversionen oder das Speichern eines Protokolls der Änderungen sind zwei gängige Verfahren.

Wenn die Anwendung die Transaktion abschließt, initiiert der Transaktionsmanager das zweiphasige Commit-Protokoll. Der Transaktionsmanager fragt zuerst jeden aufgelisteten Ressourcenmanager, ob er bereit ist, die Transaktion zu übernehmen. Der RM muss sich auf den Commit vorbereiten, d. h. er bereitet sich vor, entweder einen Commit für die Transaktion auszuführen oder den Vorgang abzubrechen.

Während der Vorbereitungsphase zeichnet der dauerhafte Ressourcen-Manager die alten und neuen Daten im stabilen Speicher auf, damit der Ressourcenmanager sie auch dann wiederherstellen kann, wenn das System fehlschlägt. Wenn der RM die Vorbereitung vollenden konnte, informiert er den TM über seine Entscheidung, ob ein Commit für die Transaktion ausgeführt oder die Transaktion abgebrochen werden soll. Wenn ein Ressourcenmanager einen Fehler bei der Vorbereitung meldet, sendet der Transaktions-Manager einen Rollbackbefehl an jeden Ressourcen-Manager und gibt den Fehler des Commits an die Anwendung an.

Nach der Vorbereitung muss ein RM warten, bis er in Phase 2 einen Commit- oder Abbruchrückruf vom TM erhält. In der Regel wird das gesamte Vorbereitungs- und Commitprotokoll in einem Bruchteil einer Sekunde abgeschlossen. Wenn System- oder Kommunikationsfehler auftreten, kommt die Commit- oder Abbruchbenachrichtigung möglicherweise nicht für Minuten oder Stunden an. Während dieses Zeitraums zweifelt der Ressourcenmanager an dem Ergebnis der Transaktion. Es weiß nicht, ob die Transaktion durchgeführt oder abgebrochen wurde. Während der Ressourcenmanager im Zweifel über eine Transaktion ist, hält er die Transaktion gesperrt und isoliert dadurch die geänderten Daten von anderen Transaktionen.

Wenn ein Ressourcenmanager fehlschlägt, werden alle beteiligten Transaktionen abgebrochen, außer denen, die vor dem Fehler vorbereitet oder festgeschrieben wurden. Wenn ein dauerhafter RM neu startet, rekonstruiert er den Commitzustand der von ihm verwalteten Ressourcen, indem er die Informationen, die in der Vorbereitungsphase geschrieben wurden, abruft. Danach führt er entsprechend diesen Informationen einen Commit dieser Transaktionen aus oder bricht sie ab.

Zusammenfassend kann man sagen, dass das Zweiphasencommit-Protokoll und die RMs zusammen dafür sorgen, dass die Transaktionen unteilbar und dauerhaft sind.

Die Transaction-Klasse stellt die EnlistPromotableSinglePhase-Methode auch bereit, um eine Erweiterbare Einphaseneintragung (PSPE) vorzunehmen. Auf diese Weise kann ein beständiger Ressourcenmanager (RM) eine Transaktion hosten und "besitzen", die später, falls erforderlich, zur Verwaltung an den MSDTC übergeben werden kann. Weitere Informationen hierzu finden Sie unter Optimierung durch „Single Phase Commit“ und „Promotable Single Phase Notification“.

In diesem Abschnitt

Die Schritte, die im Allgemeinen von einem Ressourcenmanager befolgt werden, werden in den folgenden Themen beschrieben.

Einbeziehen von Ressourcen als Akteure in einer Transaktion

Beschreibt, wie sich eine persistente oder flüchtige Ressource an einer Transaktion beteiligen kann.

Ausführen eines Einphasen- oder Mehrphasencommits für eine Transaktion

Beschreibt, wie ein Ressourcenmanager auf Commitbenachrichtigungen reagiert und den Commit vorbereitet.

Durchführen einer Wiederherstellung

Beschreibt, wie sich ein dauerhafter Ressourcenmanager von einem Ausfall erholt.

Sicherheitsvertrauensstufen beim Zugriff auf Ressourcen

Beschreibt, wie die drei Vertrauensebenen für System.Transactions den Zugriff auf die Ressourcentypen einschränken, die durch System.Transactions bereitgestellt werden.

Optimierung mit Einphasencommit und heraufstufbarer Einphasenbenachrichtigung

Beschreibt Optimierungsmethoden, die für Implementierungen von Ressourcenmanagern verfügbar sind.