Ich war verwirrt durch die Tatsache, dass wir JTA-Transaktionen mit einer Nicht-XA-Datenquelle verwenden können. Link to the documentation. Was ist der Unterschied zwischen XA/Nicht-XA-Datenquellen? Warum sollten wir überhaupt XA-Datenquellen verwenden?Was ist der Unterschied zwischen nonXADatasource mit jta = "true" und XADataSource?
Antwort
Eine XA-Transaktion ist im Allgemeinen eine "globale Transaktion", die sich über mehrere Ressourcen erstrecken kann. Eine Nicht-XA-Transaktion umfasst immer nur eine Ressource.
Eine XA-Transaktion umfasst einen koordinierenden Transaktionsmanager mit einer oder mehreren Datenbanken (oder anderen Ressourcen wie JMS), die alle an einer einzigen globalen Transaktion beteiligt sind. Nicht-XA-Transaktionen haben keinen Transaktionskoordinator, und eine einzelne Ressource führt ihre gesamte Transaktionsarbeit selbst aus (dies wird manchmal als lokale Transaktion bezeichnet).
jta = "true", Transaktionsübergabe automatisch.
Ich frage mich selbst ("JTA" Option in einer nicht-XA Datenquelle), also habe ich mehrere Konfigurationen getestet. Ich habe eine verteilte Transaktion, die eine Verbindung zu zwei MySQL-Servern herstellt.
Hier sind meine Ergebnisse. Wenn ich habe:
- Zwei Nicht-XA-Datenquellen, haben beide JTA = "true"
Ergebnis: "können nicht in der Transaktion gewinnen beim Eintritt in meta-aware Objekt" Fehler
- Zwei Nicht-XA-Datenquellen, mit einem JTA = "true"
Ergebnis: Sie werden nicht in der verteilten Transaktion teilnehmen. Jeder wird separat begehen.
- One XA und ein Nicht-XA mit JTA = "false",
Ergebnis: wie # 2
- Ein XA und ein Nicht-XA mit JTA = "true".
Ergebnis: Funktioniert!
Von diesen sieht es aus wie "JTA verwenden" -Option zeigt an, ob es an einer verteilten Transaktion teilnehmen wird, wenn es eine XA-Datenquelle gibt.