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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top