En una aplicación web, estoy usando diferentes componentes, todos los cuales están usando Spring 3.0.x teniendo su propio DataSource
y TransactionManager
(Todos con nombres diferentes). Todos ellos están incluidos en el contexto a través de la aplicación web "principal" a través de incluir su configuración de primavera.
<import resource="classpath:spring-config-componentName.xml" />
En cada una de las configuraciones Spring de los componentes, estoy usando la gestión declarativa de transacciones, habilitada a través de
<tx:annotation-driven transaction-manager="transactionManager_componentName" />
Y para cada método que debería ser transaccional, agrego una anotación que se ve así:
@Transactional(propagation=Propagation.REQUIRES_NEW, value="transactionManager_componentName")
El problema que tengo es que descubrí que solo uno TransactionInterceptor
se crea y tiene una referencia a uno de los gestores de transacciones pero no al del componente en sí. ¿Hay una manera de manejar esto? Me gusta especificar un TransactionInterceptor
como un frijol y luego referenciarlo en el @Transactional
¿anotación?
Creo que hay una posibilidad especificando un TransactionProxyFactoryBean
en cada componente y haciendo la gestión declarativa de transacciones a través de la configuración xml. Pero esto es algo que me gustaría evitar.
La forma propuesta como se describe en los documentos de primavera (10.5.6.2 Gestores de transacciones múltiples con @Transactional) No funciona.
Respuestas
0 para la respuesta № 1Finalmente, descubrí cuál era el problema y debo decir que funciona como se describe en los documentos de primavera. Si está utilizando más de uno TransactionManager
en su contenedor de primavera y está utilizando @Transaction
lo hace no Trabaja si estás especificando el TransactionManager
Me gusta esto:
<tx:annotation-driven transaction-manager="transactionManager_componentName" />
Todo lo que tienes que hacer es eliminar la especificación del TransactionManager
y usa una configuración como esta:
<!-- ========== ENABLE ANNOTATIONS ========== -->
<tx:annotation-driven/>
<!-- ========== TRANSACTION MANAGER ========== -->
<bean id="transactionManager_component1"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource_component1" />
<property name="nestedTransactionAllowed" value="true" />
<qualifier value="component1"/>
</bean>
Y para los métodos que desea ejecutar en una transacción, simplemente especifíquelo así:
@Transactional(value="component1")