0

在一个 web 应用程序中,我使用不同的组件,这些组件都使用 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创建了一个引用事务管理器之一而不是组件本身之一的引用。有没有办法处理这个?喜欢将 a 指定TransactionInterceptor为 bean,然后在@Transactional注解中引用它?

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

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

4

1 回答 1

0

最后我发现了问题所在,我不得不说它的工作原理与 spring 文档中描述的一样。如果您在 Spring Container 中使用了多个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")
于 2012-02-17T09:42:20.430 回答