In den frühen Tagen der Computertechnik waren verteilte Transaktionen nicht erforderlich. Mit zunehmender Anzahl von Anwendungen wird die Synchronisierung der Daten zu einem wichtigen Thema. Unternehmen haben viel für die Aufrechterhaltung synchronisierter Systeme in Bezug auf den Datenfluss bezahlt. Als Ergebnis entstand das 2-Phasen-Commit-Protokoll, das als XA (eXtended Architecture) bezeichnet wird. Dieses Protokoll bietet ACID-ähnliche Eigenschaften für die globale Transaktionsverarbeitung. In diesem Artikel werde ich versuchen, Details von XA-Transaktionen und die Verwendung von XA-Transaktionen im Spring-Framework zu erklären.

Das 2-Phasen-Commit-Protokoll ist ein atomares Commitment-Protokoll für verteilte Systeme. Dieses Protokoll besteht, wie der Name schon sagt, aus zwei Phasen. Die erste ist die Festschreibungsanforderungsphase, in der der Transaktionsmanager alle Transaktionsressourcen zum Festschreiben oder Abbrechen koordiniert. In der Festschreibungsphase entscheidet der Transaktionsmanager, die Operation durch Festschreiben oder Abbrechen gemäß den Stimmen jeder Transaktionsressource abzuschließen. Als nächstes werden wir uns den Implementierungsdetails des 2PC-Protokolls zuwenden.

Hier finden Sie Ressourcen zur Java + .NET-Interoperabilität über 2PC.

XA-Transaktionen benötigen eine globale Transaktions-ID und eine lokale Transaktions-ID (xid) für jede XA-Ressource. Jede XA-Ressource wird von XA Manager durch die Methode start(xid) eingetragen. Diese Methode teilt mit, dass die XA-Ressource an der Transaktion beteiligt ist (betriebsbereit sein). Danach wird die erste Phase des 2PC-Protokolls durch Aufrufen der Prepare(xid)-Methode realisiert. Diese Methode fordert die Abstimmung OK oder ABORT von der XA-Ressource an. Nach Erhalt der Abstimmung von jeder XA-Ressource entscheidet der XA-Manager, eine Commit(xid)-Operation auszuführen, wenn alle XA-Ressourcen OK senden, oder entscheidet, ein Rollback (xid) auszuführen, wenn eine XA-Ressource ABORT sendet. Schließlich wird die end(xid)-Methode für jede XA-Ressource aufgerufen, die mitteilt, dass die Transaktion abgeschlossen ist. Schauen Sie sich die Abbildung an, um es besser zu verstehen. Während wir einen Hintergrund in der XA-Transaktionsimplementierung aufbauen, werden wir als Nächstes tiefer gehen und sehen, wie Sie diesen Befehl eingeben Dieser Befehl diese Befehle von Fehlern und möglichen Lösungen.


Ausfälle können jederzeit aufgrund von Netzwerkverlusten, Maschinenausfällen und Administratorfehlern auftreten. In der XA-Transaktion kategorisieren wir diese Fehler nach den Phasen, in denen sie auftreten. Die erste Fehlerphase ist, bevor das Protokoll gestartet wird. Dies ist ein einfacher Fehler, bei dem das System kein Rollback oder irgendeine Art von Operation durchführen muss. Wir führen die Operation einfach nicht für diesen bestimmten Moment durch. Zweitens geben Sie diesen Befehl ein. Dieser Befehl kann in der Vorbereitungsphase (commit-request) auftreten, was leicht durch Rollbacks unter Verwendung von Timeout-Richtlinien gehandhabt werden kann. Zu guter Letzt gibt es Commit-Phasenfehler, die aufgrund von unvollständigen Rollbacks und Problemen in der Kette auftreten können. In allen oben genannten Situationen versucht der Transaktionsmanager, das Problem zu beheben. Als nächstes werden wir sehen, wie der Transaktionsmanager versucht, Fehler zu überwinden.

Bei der Wiederherstellung ruft der Transaktionsmanager die Wiederherstellungsmethode jeder XA-Ressource auf. XA Resources verfolgt die Protokolle und versucht, den letzten Zustand wiederherzustellen. Der Transaktionsmanager ruft die erforderlichen Rollback-Operationen auf und die Mission ist erfüllt. Dieser Prozess scheint ein glücklicher Weg zu sein, aber es gibt viele Ausnahmesituationen, in denen Protokolle problematisch sind, z. B. wenn sie beschädigt werden. In solchen Situationen folgt der Transaktionsmanager einigen Heuristiken, um das Problem zu lösen. Darüber hinaus hängt der Wiederherstellungsprozess von den Write-Ahead-Protokollen ab, in die Sie vor der Anwendung Vorgangsprotokolle schreiben. Aus Leistungsgründen werden diese Protokolle in ihrem eigenen Format geschrieben (ohne Serialisierung) und das System sollte sie nach Möglichkeit besser bündeln. Als nächstes gehen wir zum lustigen Teil, der XA-Transaktionsunterstützung durch das Spring-Framework ist.

Das Spring-Framework bietet eine umfangreiche Umgebung zum Entwickeln von Web- und eigenständigen Anwendungen. Wie andere bereitgestellte Dienstprogramme werden auch XA-Transaktionen von Spring unterstützt. Diese Unterstützung ist jedoch keine native Implementierung und erfordert Hibernate, Webcontainer oder ein Framework, das XA Transaction Management bereitstellt. Spring hat JtaTransactionManager, der Dienstprogramme zur Transaktionsverwaltung bereitstellt und die Details verbirgt. Auf diese Weise können wir eine Transaktionsverwaltung für mehrere DataSources haben, die gleichzeitig aktualisiert werden. Wenn es um die Verwendung von XA Transaction Management geht, sind Hibernate und Web-Container-Unterstützung für XA-Transaktionen gut dokumentiert, müssen nicht erwähnt werden. Die Arbeit mit einem Framework, das XA-Transaktionen bereitstellt, kann jedoch verwirrend sein. Daher werde ich diesen Beitrag fortsetzen, indem ich den Bitronix Transaction Manager vorstelle.

Bitronix ist einfach zu konfigurieren und bietet gleichzeitig eine gute Unterstützung für das Transaktionsmanagement. Es wird normalerweise nicht in eigenständigen Anwendungen verwendet, aber ich werde versuchen, die Konfiguration für eigenständige Anwendungen wie folgt bereitzustellen.

Wir können jetzt mehrere Datenquellen haben, die wie folgt konfiguriert werden können. Jede Datenquelle sollte eine UniqueName-Eigenschaft haben, die eindeutig ist. Die folgende Konfiguration gilt für Oracle, andere Datenbanken können andere Konfigurationen haben. Für alle anderen Details können Sie die Bitronix-Website überprüfen.

Zusammenfassend haben wir versucht zu erklären, was XA-Transaktionen, zugrunde liegende Protokolle und die Bitronix Transaction Management-Integration mit Spring in einer eigenständigen Anwendung sind. Zur Erweiterung bietet XA Transactions die gleichzeitige Änderung verschiedener Datenquellen. Darüber hinaus werden XA-Transaktionen von Webcontainern oder Hibernate-ähnlichen Frameworks unterstützt. Trotzdem müssen wir möglicherweise das Transaktionsmanagement in eine eigenständige Anwendung integrieren, in der wir den Transaktionsmanager konfigurieren müssen. Infolgedessen bietet die XA-Transaktion konsistente Operationen auf mehreren Datenquellen, und Unternehmen nutzen sie.
Wir hoffen, dass dieser Artikel Ihnen bei XA-Transaktionen (2-Phasen-Commit): Eine einfache Anleitung geholfen hat. Wenn Sie weitere Fragen haben, beantworten wir Ihre gerne; Bitte kontaktieren Sie uns im Abschnitt unten. Teilen nicht vergessen signalfix.net mit deiner Familie und deinen Freunden!