Wenn ich auf UserTransaction zugreife, bedeutet das, dass ich 2-Phasen-Commit oder XA verwende?
-
19-09-2019 - |
Frage
UserTransaction ut=lookup....ut.beginTransaction();saveToFooDB();statelessEjb.transactionSupportedMethod();// rettet etwas vor dem foo db SavetofoodB ();ut.commit();
Wenn ich das oben Gesagte getan habe, dann ist es meines Erachtens keine XA-Transaktion, da sie sich nicht über mehrere Ressourcen erstreckt (wie DB plus JMS).Ist mein Verständnis richtig?
Lösung
Datenquelle kann von zwei Arten konfiguriert werden:
- XA : diese Datenquelle können Transaktionen teilnehmen verteilen
- Lokal : auch Nicht-XA genannt, können sie in einer verteilten Transaktion nicht teilnehmen
Die UserTransaction
ist in der JTA-Spezifikation definiert, die beschreiben, wie die Teilnehmer in einer verteilten Transaktion zu koordinieren.
Der Anwendungsserver, der die JTA-Spezifikation implementiert, ist jedoch frei, eine Menge Optimierungen zu tun. Einer von ihnen ist der last-agent-optimization
, die der letzte Teilnehmer in der verteilten Transaktion erlaubt sein Lokal . Eine regelmäßige commit wird dann für die letzten Teilnehmer getan. Wenn es nur ein Teilnehmer ist, dann ist es immer der Fall ist.
Kurz gesagt:
- , wenn Sie mehr als ein Teilnehmer haben, XA und 2 Phasen-Commit verwendet werden müssen
- , wenn es nur ein Teilnehmer, die meisten Anwendungsserver Unterstützung lokale Datenquelle und verwenden Sie nicht die vollen Schlag 2-Phasen-Commit-Protokoll.
Für Glassfish siehe:
Bearbeiten
Paragraph "Transaktionsbereich" von Glasfischen Dokumentation erklärt es besser als ich. Ich denke, es ist das gleiche für alle Anwendungsserver.
Eine lokale Transaktion umfasst nur eine Nicht-XA-Ressource und erfordert, dass alle beteiligten Anwendungskomponenten innerhalb eines Prozesses ausgeführt werden. Lokal Transaktions Optimierung ist spezifisch an den Ressourcenmanager und transparent für die Java EE Anwendung.
In dem Application Server, ein JDBC Ressource ist nicht-XA, wenn es erfüllt alle die folgenden Kriterien:
In der JDBC-Verbindung Pool-Konfiguration, die Datasource-Klasse nicht implementiert die javax.sql.XADataSource Schnittstelle.
Das Global Transaction Support-Box nicht aktiviert ist, oder die Ressource Typ Einstellung nicht existiert oder nicht auf javax.sql.XADataSource.
Eine Transaktion lokal bleibt, wenn die Folgende Bedingungen treu bleiben:
- Ein und nur ein Nicht-XA-Ressource verwendet wird. Wenn ein zusätzlichen nicht-XA Ressource verwendet wird, die Transaktion abgebrochen.
- Keine Transaktion Import oder Export auftritt.
Transaktionen, die mehrere einbeziehen Ressourcen oder mehrere Teilnehmer Prozesse werden verteilt oder global Transaktionen. Eine globale Transaktion kann beinhaltet eine Nicht-XA-Ressource, wenn letzten Agent Optimierung aktiviert ist. Andernfalls müssen alle resourced XA sein. Der Einsatz-last-Agent-Optimierung Eigenschaft ist standardmäßig auf true gesetzt. Einzelheiten dazu, wie diese Einstellung vornehmen, Eigenschaft finden Sie unter Konfigurieren der Transaction Service.
Wenn nur ein XA-Ressource in einem benutzten Transaktion, ein-Phasen-Commit auftritt, ansonsten die Transaktion koordiniert mit einem Zwei-Phasen-Commit Protokoll.
Andere Tipps
Sobald Sie die UserTransaction starten und dann mithilfe einer Verbindungsfabrik, die als XA-unterstützend deklariert ist, eine Verbindung zur Ressource (z. B. Datenbanken) herstellen, bedeutet dies, dass die Verbindung Teil der XA-Transaktion wird.Außerdem spielt es überhaupt keine Rolle, ob Sie eine Verbindung zu einzelnen oder mehreren Arten von Ressourcen wie JMS und Datenbanken herstellen.
Hoffentlich hilft das.
Nitin