EJB Container Transaction macht keine Rollback !

GartenUmgraben

Erfahrenes Mitglied
Moin...

In meiner Session Bean habe ich die Funtkion "Buchung" angelgt, bei der quasie der Kontostand zweier Konten,
welche auf verschiedenen Datenbanken liegen, geändert werden soll.


Code:
 public void Buchung(Integer KNr_1, Integer KNr_2, Double Betrag)
    {
      DB_2.ejb.Server.interfaces.KontoLocalHome kontoHome = (DB_2.ejb.Server.interfaces.KontoLocalHome) ServiceLocator
         .getServiceLocator().lookup(DB_2.ejb.Server.interfaces.KontoLocalHome.JNDI_NAME,
                 DB_2.ejb.Server.interfaces.KontoLocalHome.class);
      
      DB_2.ejb.Server.interfaces.Konto2LocalHome konto2Home = (DB_2.ejb.Server.interfaces.Konto2LocalHome) ServiceLocator
	      .getServiceLocator().lookup(DB_2.ejb.Server.interfaces.Konto2LocalHome.JNDI_NAME,
	             DB_2.ejb.Server.interfaces.Konto2LocalHome.class);
    try {
    	 // Hole Konto_1 bzw. dessen Kontostand
         DB_2.ejb.Server.interfaces.KontoLocal kontoLocal_1 = kontoHome.findByPrimaryKey(KNr_1);
         Double kontoKontostand_1  = kontoLocal_1.getKontostand();
         
         // Hole Konto_2 bzw. dessen Kontostand
         DB_2.ejb.Server.interfaces.Konto2Local konto2Local_2 = konto2Home.findKonto2ByKontonummer2(KNr_2); 
	 Double kontoKontostand_2  = konto2Local_2.getKontostand2();
        
         // Errechne neue Kontostände   
         Double kontoKontostand_1_neu  = new Double(kontoKontostand_1.doubleValue()- Betrag.doubleValue());
         Double kontoKontostand_2_neu  = new Double(kontoKontostand_2.doubleValue()+ Betrag.doubleValue());    
         
         // Zuweisung neuer Kontostand euf DB_1
         kontoLocal_1.setKontostand(kontoKontostand_1_neu);
         
         
            //TransaktionsPrüfung --> 30sec Break durch Schleife
            int a= 0;
            for ( double i = 0; i<5000000000.0; i++){a++; }

         // Zuweisung neuer Kontostand euf DB_2
         konto2Local_2.setKontostand2(kontoKontostand_2_neu);
         
         
         } 
         catch (FinderException e) {e.printStackTrace();}	
    	
    	
    }


Ich habe in der EJB-Jar.exml festgelegt, dass diese Funktion als Transaction laufen 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>

Die Schleifendurchläufe erzeugen quasie ein 30sec. break zwischen der Änderung des einen Kontostands und der Änderung
des anderen. Die funtkion an sich funtioniert auch. Wenn ich nun jedoch in dem 30sec. Break mein Netzwerkkabel
und somit die Verbindung zur zweiten DB kappe..kann er ja die zweite ÄÜnderung nicht durchführen. Er wirft dann auch
wilde Exceptions, aber trotz allem macht er die Änderung am ersten Kontostabd nicht rückgängig.

Code:
2005-06-10 14:50:35,855 DEBUG [org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreEntityCommand.Konto] Executing SQL: UPDATE konto SET kontostand=? WHERE kontonummer=?
2005-06-10 14:50:35,855 DEBUG [org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreEntityCommand.Konto2] Executing SQL: UPDATE konto2 SET kontostand2=? WHERE kontonummer2=?
2005-06-10 14:50:35,875 DEBUG [org.jboss.util.NestedThrowable] org.jboss.util.NestedThrowable.parentTraceEnabled=true
2005-06-10 14:50:35,885 DEBUG [org.jboss.util.NestedThrowable] org.jboss.util.NestedThrowable.nestedTraceEnabled=false
2005-06-10 14:50:35,885 DEBUG [org.jboss.util.NestedThrowable] org.jboss.util.NestedThrowable.detectDuplicateNesting=true
2005-06-10 14:50:35,875 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/35, BranchQual=, localId=35] status=STATUS_NO_TRANSACTION; - nested throwable: (javax.ejb.EJBException: Store failed; CausedByException is:
	Communication link failure: java.net.SocketException, underlying cause: Connection reset by peer: socket write error

** BEGIN NESTED EXCEPTION ** 

java.net.SocketException
MESSAGE: Connection reset by peer: socket write error

STACKTRACE:

java.net.SocketException: Connection reset by peer: socket write error
	at java.net.SocketOutputStream.socketWrite0(Native Method)
	at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
	at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
	at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
	at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
	at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:1764)
	at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:1727)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1148)
	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)
	at org.jboss.tm.TransactionImpl.beforePrepare(TransactionImpl.java:1075)
	at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:296)
	at org.jboss.ejb.plugins.TxInterceptorCMT.endTransaction(TxInterceptorCMT.java:454)
	at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:367)
	at org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:146)
	at org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java:122)
	at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:192)
	at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke(ProxyFactoryFinderInterceptor.java:122)
	at org.jboss.ejb.SessionContainer.internalInvoke(SessionContainer.java:624)
	at org.jboss.ejb.Container.invoke(Container.java:870)
	at sun.reflect.GeneratedMethodAccessor71.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:144)
	at org.jboss.mx.server.Invocation.dispatch(Invocation.java:80)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:72)
	at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:249)
	at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:642)
	at org.jboss.invocation.local.LocalInvoker$MBeanServerAction.invoke(LocalInvoker.java:155)
	at org.jboss.invocation.local.LocalInvoker.invoke(LocalInvoker.java:104)
	at org.jboss.invocation.InvokerInterceptor.invokeLocal(InvokerInterceptor.java:115)
	at org.jboss.invocation.InvokerInterceptor.invoke(InvokerInterceptor.java:101)
	at org.jboss.proxy.TransactionInterceptor.invoke(TransactionInterceptor.java:46)
	at org.jboss.proxy.SecurityInterceptor.invoke(SecurityInterceptor.java:55)
	at org.jboss.proxy.ejb.StatelessSessionInterceptor.invoke(StatelessSessionInterceptor.java:97)
	at org.jboss.proxy.ClientContainer.invoke(ClientContainer.java:91)
	at $Proxy102.Buchung(Unknown Source)
	at DB_2.ejb.Client.UserServlet.doPost(UserServlet.java:127)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:75)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.jboss.web.tomcat.security.CustomPrincipalValve.invoke(CustomPrincipalValve.java:66)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:150)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:54)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
	at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
	at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
	at java.lang.Thread.run(Thread.java:595)


** END NESTED EXCEPTION **

)


Sprich Geld wird vom ersten Konto zwar abgebucht aber aufs zweite nicht raufgebucht.
Genau diesen Fall wollte ich durch die Transaction ja verhindern, sprich wenn dann beide buchungen oder gar keine. Woran kann das liegen ?


Gruß
Gärtner
 

Neue Beiträge

Zurück