Trotz Transaktion kein Rollback bei Verbindungsabbruch ?

GartenUmgraben

Erfahrenes Mitglied
Hoi

In einer Java Anwendung greifen wir per CMP auf Datenbanken zu..was auch alles wunderbar geht. Nun haben wir in der ejb-jar.xml eine Funtkion (Buchung) so konfiguriert, dass die innerhalb einer neuen Transaktion ablaufen soll.

Code:
<assembly-descriptor >
    <container-transaction>
     <method>
      <ejb-name>KontoService</ejb-name>
      <method-name>Buchung</method-name>
     </method>
     <trans-attribute>RequiresNew</trans-attribute>
    </container-transaction>
   </assembly-descriptor>


In der Funktion selbst wird ein Betrag von einer Datenbank abgebucht und anschliessend auf eine andere Datenbank (auf anderem Rechner) aufgebucht..was auch ohne Probleme funktioniert. Zwischen den beiden Buchungen habe ich per Schleife ein 30sek Break eingebaut. Trenne ich den 30sek die Verbindung zu Datenbank 2 sollte er ja die Buchung an Datenbank 1 per Rollback rückgängig machen..was er aber nicht tut.

Code:
2005-06-24 13:59:03,743 DEBUG [org.jboss.util.NestedThrowable] org.jboss.util.NestedThrowable.parentTraceEnabled=true
2005-06-24 13:59:03,743 DEBUG [org.jboss.util.NestedThrowable] org.jboss.util.NestedThrowable.nestedTraceEnabled=false
2005-06-24 13:59:03,743 DEBUG [org.jboss.util.NestedThrowable] org.jboss.util.NestedThrowable.detectDuplicateNesting=true
2005-06-24 13:59:03,743 ERROR [org.jboss.ejb.plugins.LogInterceptor] TransactionRolledbackException in method: public abstract void DB_2.ejb.Service.interfaces.KontoService.Buchung(java.lang.Integer,java.lang.Integer,java.lang.Double) throws java.rmi.RemoteException, causedBy:
org.jboss.tm.JBossRollbackException: Unable to commit, tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=Ganz_grosses_Damentennis/27, BranchQual=, localId=27] status=STATUS_NO_TRANSACTION; - nested throwable: (javax.ejb.EJBException: Store failed; CausedByException is:
	Communication link failure: java.io.EOFException, underlying cause: null

** BEGIN NESTED EXCEPTION ** 

java.io.EOFException

STACKTRACE:

java.io.EOFException
	at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1394)
	at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:1538)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1929)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1167)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1278)
	at com.mysql.jdbc.Connection.execSQL(Connection.java:2251)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1772)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1619)
	at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.executeUpdate(WrappedPreparedStatement.java:316)
	at org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreEntityCommand.execute(JDBCStoreEntityCommand.java:136)
	at org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager.storeEntity(JDBCStoreManager.java:651)
	at org.jboss.ejb.plugins.CMPPersistenceManager.storeEntity(CMPPersistenceManager.java:413)
	at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.storeEntity(CachedConnectionInterceptor.java:390)
	at org.jboss.ejb.EntityContainer.storeEntity(EntityContainer.java:743)
	at org.jboss.ejb.GlobalTxEntityMap$2.synchronize(GlobalTxEntityMap.java:134)
	at org.jboss.ejb.GlobalTxEntityMap$GlobalTxSynchronization.synchronize(GlobalTxEntityMap.java:253)
	at org.jboss.ejb.GlobalTxEntityMap$GlobalTxSynchronization.beforeCompletion(GlobalTxEntityMap.java:302)
	at org.jboss.tm.TransactionImpl.doBeforeCompletion(TransactionImpl.java:1383)

Soll heissen er bucht zwar von DB_1 ab aba nicht auf DB_2 drauf. Genau das soll ja durch die Transaktion verhindert werden. Ich benutze JBOSS 4.0.1. sp1 und MySQL 4.1.10

Muss ich evtl. den JBOSS noch konfigurieren oder irgendwelche andren Einstellungen machen ?

Das komplette Projekt anbei noch hier http://www.tfh-wildau.de/marschu/Projekt.zip
 
Hallo!

Für das was du da machen willst benötiugst du verteilte Transaktionen. Sieht ganz so aus als hättest du aber nur 2 Lokale Transaktionen... schau dir dies bezüglich doch mal den Admin Guide an... Weiterhin verlangen diese verteilte Transaktionen ein sogenanntes Two-Phase-Commit. Dabei wird in einem ersten Schritt bei allen beteiligten Transaktionen nachgefragt ob diese zu einem commit bereit sind. Ist dies der Fall werden in einem weiteren Schritt alle Transaktionen commited. Ist auch nur eine Transaktion nicht bereit zum commit wird auf diese und alle anderen beteiligten Transaktionen ein rollback durchgeführt.

Gruß Tom
 
Ok, danke...

Ich hab mich mal erkundigt und es scheint als ob eine solche Transaktion (XA) mit MySQL im Moment noch nicht geht (is wohl in Planung) was heissen würde ich müsste auf eine anderen Datenbank umstellen. Oder hast du da andere Infos ?

Gruß
Gärtner
 
Ich habe es mit einer ...xa-ds.xml probiert bekomme jedoch den gleichen Fehler. Ausser dem wird ja beim JBOSS in den JCA Beispielen eine Default xml für alle möglichen Varianten präsentiert.

Da gibt es ax Varianten von Oracle ec. jedoch nicht von MySQL was darauf schliessen lässt das JBOSS das gar nicht unterstützt. Ich habe mich beim erstellen der mysql-xa-ds ein wenig an der von oracle gehalten jedoch findet er dann die XA Packages nicht im Connector, und diese isnd darin tatsächlich nicht vorhanden.

Laut MySQL gab es direse mal in früheren Versionen jedoch nun nicht mehr bis das Feature dann ab MySQL 5.x angeblich fernünftig implementiert werden soll. Zu einer ..tx-ds.xml habe ich nichts gefunden..wie sollte die denn aussehen ? Hier noch ein Ausschnitt der mysql-xa-ds.xml
Code:
<datasources>
  <xa-datasource>
    <jndi-name>MySqlDS_1</jndi-name>
    <track-connection-by-tx/>
    <isSameRM-override-value>false</isSameRM-override-value>
    <xa-datasource-class>org.jboss.pool.jdbc.xa.wrapper.XADataSourceImpl</xa-datasource-class>
    <xa-datasource-property name="URL">jdbc:mysql://192.168.0.2:3306/bank_1</xa-datasource-property>
    <xa-datasource-property name="User">Exzensior</xa-datasource-property>
    <xa-datasource-property name="Password">schulle</xa-datasource-property>
  </xa-datasource>

  <xa-datasource>
    <jndi-name>MySqlDS_2</jndi-name>
    <track-connection-by-tx/>
    <isSameRM-override-value>false</isSameRM-override-value>
    <xa-datasource-class>org.jboss.pool.jdbc.xa.wrapper.XADataSourceImpl</xa-datasource-class>
    <xa-datasource-property name="URL">jdbc:mysql://192.168.0.1:3306/bank_2</xa-datasource-property>
    <xa-datasource-property name="User">Exzensior</xa-datasource-property>
    <xa-datasource-property name="Password">schulle</xa-datasource-property>
 </xa-datasource>
</datasources>

Gruß
 
Zuletzt bearbeitet:
Zurück