Verteilte Transaktionen (XA)

Manwithoutname

Grünschnabel
JDBC: Verteilte Transaktionen (XA)

Hallo Leute,

kann mir mal jemand etwas über die Struktur von verteilten Transaktionen erzählen.
Ich weiss das man die Datenbanken mit XADataSource initialisiert und sich die XAConnection zurückgeben lässt. Von der XAConnection lässt man sich ein "normale" nicht verteilte Connection zurück geben.
Weiter weiss ich das man die SubTransaktionen mit start (Methode von XADataSource) anfängt, dazu wird die XID der SubTransaktion übergeben.

So, aber welche Instance hält jetzt alle Fäden in der Hand und sagt zum Beispiel die Transaktion mit der XID 23 ist fehlgeschlagen und es wird die ganze Transaktion zurückgesetzt (rollback). Welche Frage sich da anschliess wäre zu wissen wie sie feststellt, ob die SubTransaktion fehlgeschlagen ist (Thema: prepare).

Ich hoffe Ihr könnt wir Auskunft geben.
 
Zuletzt bearbeitet:
Hallo!

Die verteilte Transaktion wird von dem Thread aus verwaltet in dem sie gestartet wurde.
Beispielsweise rufst du innerhalb eines SessionBeans eine Methode auf die Datenänderungen an 2 unterschiedlichen Datenquellen innerhalb einer verteilten Transaktion durchführen soll.

Wie du schon richtig geschrieben hast besorgst du dir nun jeweils eine passende XADatasource Implementierung. Aus diesen XADatasources bekommst du nun eine XAConnection. Von diesen XAConnections besorgst du dir die zugrundeliegende Connection (Damit führst du später deine Datenmanipulationen aus). Von der XAConnection besorgt man sich nun die passende XAResource. Anschließend erzeugst du für die teilnehmenden Transaktionen jeweils eine Xid.
Nun rufst du an den jeweiligen XAResourcen die Methode start mit der Xid als ersten und den Transaktionsoptionen als zweiten Parameter auf. Nun führt man die Datenmanipulation an den zugrundeliegenden Connections der XAConnections durch.
Danach ruft man die end Methode der jeweiligen XAResource mit der passenden Xid und der entsprechenden XAResource-Option auf.
Anschließend ruft man die prepare Methoden mit der jeweiligen XId als Parameter an der jeweiligen XAResource auf.

Haben alle Rückgabewerte der prepare Methoden den Wert XAResource.XA_OK, dann kann die einzelnen XAResourcen commiten. Schlägt bei einer Transaktion das prepare fehl, so muss bei allen die XAResourcen die rollback aufgerufen werden.
...

Siehe auch hier:
http://www.stanford.edu/dept/itss/docs/oracle/9i/java.920/a96654/xadistra.htm

Gruß Tom
 
Das heisst ich muss für jedes DBS eine eigene XADataSource API benutzen ?
Ich benutze im Moment die xapool API mit den Klassen StandardXADataSource und StandardXAConnection, jedoch habe ich dort Probleme mit dem prepare.
Die Methode prepare gab immer OK wieder, weil die Methode nicht ausreichend implementiert worden ist.

Kennst du eine freie API mit der man PostgreSQL kompartible ist ?
 
Zurück