我在两个单独的spring xml文件中定义了两个事务管理器,并将它们都加载到spring上下文中
文件一
<tx:annotation-driven transaction-manager="transactionManager1"/>
<bean id="transactionManager1"
class="org.springframework.jdbc.DataSourceTransactionManager">
...
</bean>
文件二
<tx:annotation-driven transaction-manager="transactionManager2"/>
<bean id="transactionManager2"
class="org.springframework.jdbc.DataSourceTransactionManager">
...
</bean>
如果我没有为以下服务指定任何限定符,那么将使用spring的事务管理器。
public class TransactionalService {
@Transactional
public void setSomething(String name) { ... }
@Transactional
public void doSomething() { ... }
}
最佳答案
从官方文档中查看 11.5.6 Using @Transactional :
由于您的事务管理器均未命名为 transactionManager
,因此您必须指定应将哪个事务管理器用于标记为 @Transactional
的方法。
更新:解决您修改后的问题。您可以指定在 @Transactional
注释上使用哪个事务管理器(请参阅: @Transactional.value()
):
@Transactional("transactionManager1")
//...
@Transactional("transactionManager2")
//...
但是,我发现您当前的设置存在几个问题:
<tx:annotation-driven/>
。我不认为这样的配置是有效的 我认为应该工作的解决方案是定义
<tx:annotation-driven transaction-manager="transactionManager1"/>
一次并使用 @Transactional
使用第一个管理器和 @Transactional("transactionManager2")
使用第二个。或者反过来。关于 Spring 多笔交易经理问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12606257/