# Trotz Transaktion kein Rollback bei Verbindungsabbruch ?



## GartenUmgraben (24. Juni 2005)

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.


```
<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. 


```
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


----------



## Thomas Darimont (25. Juni 2005)

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


----------



## GartenUmgraben (28. Juni 2005)

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


----------



## Thomas Darimont (28. Juni 2005)

Hallo!

 hast du auch eine mysql-tx-ds Datasource deployed oder nur eine normale mysql-ds ?

 edit: meinte natürlich mysql-xa-ds.xml ... die es leider nicht gibt, da der mysql J/Connector JDBC Treiber (derzeit) wohl von Haus aus keine verteilten Transaktionen  unterstützt...
 mehr dazu hier:http://www.mail-archive.com/jboss-user@lists.sourceforge.net/msg31068.html

 Gruß Tom


----------



## GartenUmgraben (5. Juli 2005)

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 

```
<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ß


----------

