/ / Spring TransactionInterceptor avec plusieurs TransactionManager - java, spring, spring-transactions

Spring TransactionInterceptor avec plusieurs TransactionManager - java, spring, spring-transactions

Dans une application Web, j'utilise différents composants qui utilisent tous Spring 3.0.x et qui ont leurs propres DataSource et TransactionManager (tous avec des noms différents). Ils sont tous inclus dans le contexte via la webapp "principale" via notamment leur config de printemps.

<import resource="classpath:spring-config-componentName.xml" />

Dans chacune des configurations Spring des composants, j'utilise la gestion déclarative des transactions, activée via

<tx:annotation-driven transaction-manager="transactionManager_componentName" />

Et pour chaque méthode qui devrait être transactionnelle, j'ajoute une annotation qui ressemble à ceci:

@Transactional(propagation=Propagation.REQUIRES_NEW, value="transactionManager_componentName")

Le problème que j’ai eu, c’est que j’ai découvert qu’un seul TransactionInterceptor est créé avec une référence à l'un des gestionnaires de transaction mais pas à celui du composant lui-même. Y at-il un moyen de gérer cela? Comme pour spécifier un TransactionInterceptor comme un haricot, puis référence dans le @Transactional annotation?

Je pense qu’il est possible de spécifier un TransactionProxyFactoryBean dans chaque composant et en effectuant la gestion déclarative des transaciton via la configuration xml. Mais c’est quelque chose que je voudrais éviter.

La manière proposée telle que décrite dans la documentation de printemps (10.5.6.2 Plusieurs gestionnaires de transactions avec @Transactional) ne marche pas.

Réponses:

0 pour la réponse № 1

Enfin, j'ai découvert quel était le problème et je dois dire que cela fonctionne comme il est décrit dans la documentation du printemps. Si vous utilisez plus d'un TransactionManagerdans votre Spring Container et que vous utilisez @TransactionCela fait ne pas travailler si vous spécifiez le TransactionManager comme ça:

<tx:annotation-driven transaction-manager="transactionManager_componentName" />

Tout ce que vous avez à faire est de supprimer la spécification du TransactionManager et utilisez une configuration comme celle-ci:

<!-- ========== 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>

Et pour vous les méthodes que vous voulez exécuter dans une transaction, spécifiez-la simplement comme ceci:

@Transactional(value="component1")