Foros del Web » Programación para mayores de 30 ;) » Java »

Transacciones en Spring e ibatis

Estas en el tema de Transacciones en Spring e ibatis en el foro de Java en Foros del Web. Hola Tengo un proyecto en el que estoy utilizando spring 1.2, ibatis 2.3 y Tomcat 6 Estoy configurando las transacciones para que se manejen mediante ...
  #1 (permalink)  
Antiguo 22/07/2011, 01:12
Avatar de edjuradob  
Fecha de Ingreso: junio-2011
Ubicación: España
Mensajes: 24
Antigüedad: 13 años, 5 meses
Puntos: 1
Transacciones en Spring e ibatis

Hola

Tengo un proyecto en el que estoy utilizando spring 1.2, ibatis 2.3 y Tomcat 6
Estoy configurando las transacciones para que se manejen mediante Spring, sin embargo, no esta funcionando correctamente.
Lo que quiero es que las transacciones esten a nivel de servicio y no a nivel DAO (para no poner toda la lógica de negocio en el DAO).
El problema es que esta generando dos transacciones distintas para cada inserción, por tanto, si genero un error, no hace el rollback y si lo dejo que ponga el read uncommited, da un error de restricción de integridad (no existe la Foreign key de la primera inserción)

Abajo mi código:

transaction-context:
Código XML:
Ver original
  1. <bean id="transactionManager"
  2.         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  3.         <property name="dataSource">
  4.             <ref bean="dataSource" />
  5.         </property>
  6.     </bean>
  7.  
  8. <bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
  9.         <property name="transactionManager" ref="transactionManager"/>
  10.         <property name="transactionAttributes">
  11.             <props>
  12.                 <prop key="insert*">
  13.                     PROPAGATION_REQUIRED,                   ISOLATION_READ_UNCOMMITTED,-BDException,-TablonException
  14.                 </prop>
  15.             </props>
  16. <!--siguientes prop keys...-->
  17.         </property>
  18.     </bean>
  19. <!-- datasource -->
  20.     <bean id="dataSource" class="com.ibatis.common.jdbc.SimpleDataSource"
  21.     destroy-method="close">
  22.  
  23.         <constructor-arg>
  24.             <map>
  25.                 <entry key="JDBC.Driver">
  26.                     <value>${jdbc.driverClassName}</value>
  27.                 </entry>
  28.                 <entry key="JDBC.ConnectionURL">
  29.                     <value>${jdbc.url}</value>
  30.                 </entry>
  31.                 <entry key="JDBC.Username">
  32.                     <value>${jdbc.username}</value>
  33.                 </entry>
  34.                 <entry key="JDBC.Password">
  35.                     <value>${jdbc.password}</value>
  36.                 </entry>
  37.                 <entry key="JDBC.DefaultAutoCommit">
  38.                     <value>false</value>
  39.                 </entry>
  40.             </map>
  41.         </constructor-arg>
  42.  
  43.     </bean>

en persistence-comu-context:
Código XML:
Ver original
  1. <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  2.         <property name="configLocation">
  3.             <value>
  4.                 /WEB-INF/config/sqlMapConfig.xml
  5.             </value>
  6.         </property>
  7.         <property name="dataSource">
  8.             <ref bean="dataSource" />
  9.         </property>
  10.     </bean>
  11. <!--    DAOS:    -->
  12. <bean id="UnDAOTarget" class="myPackage.dao.impl.UnDAOImpl" >
  13.         <property name="sqlMapClient">
  14.             <ref bean="sqlMapClient " />
  15.         </property>
  16.         <property name="dataSource" ref="dataSource" />
  17.     </bean>
  #2 (permalink)  
Antiguo 22/07/2011, 18:14
 
Fecha de Ingreso: enero-2008
Mensajes: 197
Antigüedad: 16 años, 10 meses
Puntos: 10
Respuesta: Transacciones en Spring e ibatis

Estas cerrando la transaccion primera en alguna parte? ya que tienes PROPAGATION_REQUIRED y se supone que deberia correr en la transaccion que esta en curso y si no, genera una.
  #3 (permalink)  
Antiguo 02/08/2011, 02:28
Avatar de 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

Hola

Que me he ido de vacaciones y no habia visto la respuesta.
No, no estoy cerrando las transacciones (al menos no explicitamente), de hecho, quiero que las dos inserciones se hagan en la misma transacción y solo especifico que haga el rollback en la captura de la excepcion. Lo que quiero es que si falla la segunda haga el rollback, pero no esta haciendo ni caso a esta configuración.

El hecho es que si le pongo en el datasource la propiedad
Código XML:
Ver original
  1. <entry key="JDBC.DefaultAutoCommit">
  2.               <value>false</value>
  3.  </entry>
da el error de integridad (no existe la foreign key que pretende usar en la segunda inserción, que debió insertarse en la primera inserción exitosa, aun teniendo el ISOLATION_READ_UNCOMMITTED).

Sin embargo, si le pongo el autocommit a true, cuando falla la segunda, no hace el rollback.

Lo he intentado ahora con el JOTM y he llegado al mismo punto.
  #4 (permalink)  
Antiguo 03/08/2011, 02:20
Avatar de 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?

Etiquetas: ibatis, spring, transacciones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:03.