我在两个单独的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/

    10-11 07:53