繁体   English   中英

具有多个TransactionManager的Spring TransactionInterceptor

[英]Spring TransactionInterceptor with multiple TransactionManager

在一个Web应用程序中,我正在使用不同的组件,这些组件全部使用具有自己的DataSourceTransactionManager (均具有不同名称)的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM