Spring TransactionInterceptor具有多个TransactionManager

时间:2012-02-13 19:23:01

标签: java spring spring-transactions

在webapplication中,我使用的是不同的组件,这些组件都使用Spring 3.0.x,它们有自己的DataSourceTransactionManager(所有名称都不同)。它们都通过“主”webapp包含在上下文中,包括它们的spring配置。

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

在组件的每个Spring配置中,我使用声明式事务管理,通过

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

对于应该是事务性的每个方法,我添加一个如下所示的注释:

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

我遇到的问题是我发现只创建了一个TransactionInterceptor,它引用了一个transactionManagers而不是一个组件本身。有办法处理这个吗?喜欢将TransactionInterceptor指定为bean,然后在@Transactional注释中引用它?

我认为有可能通过在每个组件中指定TransactionProxyFactoryBean并通过xml配置进行声明式transaciton管理。但这是我想避免的。

Spring文档(10.5.6.2 Multiple Transaction Managers with @Transactional)中描述的建议方法不起作用。

1 个答案:

答案 0 :(得分:0)

最后我发现问题是什么,我不得不说它的工作方式与Spring文档中描述的一样。 如果您在Spring容器中使用多个TransactionManager并且正在使用@Transaction,那么如果您正在指定TransactionManager,则工作:< / p>

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

您只需删除TransactionManager的规范并使用如下配置:

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

对于您想要在事务中运行的方法,只需将其指定为:

@Transactional(value="component1")