/ / Spring TransactionInterceptor con múltiples TransactionManager - transacciones en java, spring, spring

Spring TransactionInterceptor con múltiples TransactionManager - java, spring, spring-transactions

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 № 1

Finalmente, 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 TransactionManageren su contenedor de primavera y está utilizando @Transactionlo 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")