[英]Spring fails to choose between multiple TransactionManager beans
[英]Spring TransactionInterceptor with multiple TransactionManager
在一个Web应用程序中,我正在使用不同的组件,这些组件全部使用具有自己的DataSource
和TransactionManager
(均具有不同名称)的Spring3.0.x。 通过包括它们的spring配置,它们都通过“主” webapp包含在上下文中。
<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配置进行声明性转账管理来实现。 但这是我要避免的事情。
Spring docs( 10.5.6.2具有@Transactional的多个事务管理器 )中描述的建议方法不起作用。
最终,我发现了问题所在,我不得不说它可以按照spring docs中的描述工作。 如果您在Spring容器中使用多个TransactionManager
,并且使用@Transaction
,则在指定TransactionManager
无法正常工作:
<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")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.