Ver Mensaje Individual
  #4 (permalink)  
Antiguo 03/08/2011, 02:20
Avatar de edjuradob
edjuradob
 
Fecha de Ingreso: junio-2011
Ubicación: España
Mensajes: 24
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Transacciones en Spring e ibatis

He logrado hacer que este todo en una sola transaccion utilizando el JOTM y JTA., sin embargo, no esta haciendo el commit en la base de datos, aunque en el log me dice que si que lo hace.

Mi código con JOTM:

Código XML:
Ver original
  1. <bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/>
  2. <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
  3.   <property name="userTransaction">
  4.    <ref local="jotm"/>
  5.   </property>
  6.  </bean>
  7.  
  8.  
  9. <!-- <bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource" > -->
  10.     <bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" >  
  11.         <property name="transactionManager">
  12.          <ref local="transactionManager"/>
  13.         </property>
  14.         <property name="target" ref="publicacionesTarget"/>
  15.    
  16.         <property name="transactionAttributes">
  17.             <props>
  18.                 <prop key="update*">
  19.                     PROPAGATION_REQUIRED,
  20.                     ISOLATION_DEFAULT,-BDException,-TablonException,  readOnly
  21.                 </prop>
  22.                 <prop key="set*">
  23.                     PROPAGATION_REQUIRED,
  24.                     ISOLATION_DEFAULT,-BDException,-TablonException,  readOnly
  25.                 </prop>
  26.                 <prop key="insert*">
  27.                     PROPAGATION_REQUIRED,
  28.                     ISOLATION_READ_UNCOMMITTED,-BDException,-TablonException
  29.                 </prop>
  30.                 <prop key="delete*">
  31.                     PROPAGATION_REQUIRED,
  32.                     ISOLATION_DEFAULT,-BDException,-TablonException, readOnly
  33.                 </prop>
  34.                 <prop key="select*">
  35.                     PROPAGATION_REQUIRED,
  36.                     ISOLATION_READ_UNCOMMITTED,-BDException,-TablonException
  37.                 </prop>
  38.                 <!-- <prop key="select*">
  39.                     PROPAGATION_SUPPORTS,
  40.                     ISOLATION_READ_UNCOMMITTED, readOnly
  41.                 </prop> -->
  42.                 <prop key="get*">
  43.                     PROPAGATION_SUPPORTS, ISOLATION_DEFAULT, readOnly
  44.                 </prop>
  45.             </props>
  46.         </property>
  47.     </bean>
  48.    
  49.    
  50.     <!-- datasource -->
  51.     <bean id="dataSource" class="com.ibatis.common.jdbc.SimpleDataSource"
  52.     destroy-method="close">
  53. <!--        destroy-method="finalize"> -->
  54.         <constructor-arg>
  55.             <map>
  56.                 <entry key="JDBC.Driver">
  57.                     <value>${jdbc.driverClassName}</value>
  58.                 </entry>
  59.                 <entry key="JDBC.ConnectionURL">
  60.                     <value>${jdbc.url}</value>
  61.                 </entry>
  62.                 <entry key="JDBC.Username">
  63.                     <value>${jdbc.username}</value>
  64.                 </entry>
  65.                 <entry key="JDBC.Password">
  66.                     <value>${jdbc.password}</value>
  67.                 </entry>
  68.                 <entry key="JDBC.DefaultAutoCommit">
  69.                     <value>false</value>
  70.                 </entry>
  71.             </map>
  72.         </constructor-arg>
  73.  
  74.     </bean>

Ahora, en mi action, cuando le digo lo de la transacción hago lo siguiente:

Código Java:
Ver original
  1. JtaTransactionManager tm = (JtaTransactionManager) CargadorBeans.localizar("transactionManager");          
  2.         TransactionStatus transactionStatus =tm.getTransaction(null);      
  3.  
  4.         try {
  5.             forward = ejecutar(mapping, form, request, response);
  6.             tm.commit(transactionStatus);
  7.    
  8.         }catch (Exception e){
  9.             //tratamiento excepciones
  10.             tm.rollback(transactionStatus);
  11.        
  12.         }

y en el log, me dice que hace lo siguiente:

Código LOG:
Ver original
  1. 2011/08/03 09:31:13,105 DEBUG org.springframework.transaction.support.AbstractPlatformTransactionManager.handleExistingTransaction(438)===> Participating in existing transaction
  2. 2011/08/03 09:31:13,105 DEBUG org.springframework.transaction.interceptor.TransactionAspectSupport.prepareTransactionInfo(279)===> Getting transaction for [MiPaquete.clase.metodo]
  3. 2011/08/03 09:31:13,105 DEBUG org.springframework.transaction.support.TransactionSynchronizationManager.getResource(140)===> Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@a65760] for key [com.ibatis.common.jdbc.SimpleDataSource@1b64b70] bound to thread [http-8080-1]
  4. 2011/08/03 09:31:13,105 DEBUG com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl.debug(27)===> {conn-100020} Connection
  5.  
  6. ...Sentencias SQL...

y despues de eejecutar las sentencias sql, sigue con lo siquiente:

Código LOG:
Ver original
  1. 2011/08/03 09:31:13,136 DEBUG org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(309)===> Completing transaction for [miPaquete.clase.metodo]
  2. 2011/08/03 09:31:13,136 DEBUG org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCommit(822)===> Triggering beforeCommit synchronization
  3. 2011/08/03 09:31:13,136 DEBUG org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCompletion(835)===> Triggering beforeCompletion synchronization
  4. 2011/08/03 09:31:13,136 DEBUG org.springframework.transaction.support.TransactionSynchronizationManager.unbindResource(193)===> Removed value [org.springframework.jdbc.datasource.ConnectionHolder@a65760] for key [com.ibatis.common.jdbc.SimpleDataSource@1b64b70] from thread [http-8080-1]
  5. 2011/08/03 09:31:13,136 DEBUG org.springframework.jdbc.datasource.DataSourceUtils.doReleaseConnection(312)===> Returning JDBC Connection to DataSource
  6. 2011/08/03 09:31:13,136 DEBUG com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl.debug(27)===> Returned connection 33020888 to pool.
  7. 2011/08/03 09:31:13,136 DEBUG org.objectweb.jotm.TransactionImpl.getStatus(581)===> TransactionImpl.getStatus()
  8. 2011/08/03 09:31:13,136 DEBUG org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(649)===> Initiating transaction commit
  9. 2011/08/03 09:31:13,136 DEBUG org.objectweb.jotm.Current.commit(464)===> tx=bb14:38:0:012ceab1ed5eb54f6c...980c02:
  10. 2011/08/03 09:31:13,136 DEBUG org.objectweb.jotm.TransactionImpl.commit(209)===> TransactionImpl.commit (tx= bb14:38:0:012ceab1ed5eb54f6c...980c02:)
  11. 2011/08/03 09:31:13,136 DEBUG org.objectweb.jotm.TransactionImpl.unsetTimer(919)===> unset timer for tx (timer=org.objectweb.jotm.TimerEvent@1c4d594, tx=bb14:38:0:012ceab1ed5eb54f6c...980c02:)
  12. 2011/08/03 09:31:13,136 DEBUG org.objectweb.jotm.TimerEvent.unset(123)===> TimerEvent(bb14:38:0:012ceab1ed5eb54f6c...980c02:).unset
  13. 2011/08/03 09:31:13,136 DEBUG org.objectweb.jotm.Current.forgetTx(1147)===> xid=bb14:38:0:012ceab1ed5eb54f6c...980c02:
  14. 2011/08/03 09:31:13,136 DEBUG org.objectweb.jotm.Current.forgetTx(1156)===> threadTx.set = null
  15. 2011/08/03 09:31:13,136 DEBUG org.objectweb.jotm.Current.removeTxXid(1756)===> remove tx from xid (xid=bb14:38:0:012ceab1ed5eb54f6c...980c02:)
  16. 2011/08/03 09:31:13,136 DEBUG org.objectweb.jotm.Current.commit(476)===> threadTx.set null

y el id de la transaccion (bb14:38:0:012ceab1ed5eb54f6c...980c02) es el mismo de la primera transacción generada, es decir, es correcta la transacción que se cierra y se supone hace el commit.

¿tengo algo mal? ¿me hace falta incluir algo?