spring多个事务管理器问题

use*_*526 7 spring transactions

我有两个事务管理器在两个单独的spring xml文件中定义,并且它们都加载到spring上下文中

文件一

   <tx:annotation-driven transaction-manager="transactionManager1"/>

  <bean id="transactionManager1"
       class="org.springframework.jdbc.DataSourceTransactionManager">
    ...
  </bean>
Run Code Online (Sandbox Code Playgroud)

文件二

 <tx:annotation-driven transaction-manager="transactionManager2"/>
  <bean id="transactionManager2"
          class="org.springframework.jdbc.DataSourceTransactionManager">
    ...
  </bean> 
Run Code Online (Sandbox Code Playgroud)

如果我没有为下面的服务指出任何限定符,那么将使用哪个事务管理器spring.

public class TransactionalService {

    @Transactional
    public void setSomething(String name) { ... }

    @Transactional
    public void doSomething() { ... }
}
Run Code Online (Sandbox Code Playgroud)

Tom*_*icz 15

查看11.5.6使用官方文档中的@Transactional:

您可以省略transaction-manager属性的<tx:annotation-driven/>标签,如果的bean的名字PlatformTransactionManager要丝具有名称transactionManager.如果PlatformTransactionManager要依赖注入的bean具有任何其他名称,则必须transaction-manager明确使用该属性[...]

由于您的事务管理器都没有命名transactionManager,因此必须指定应使用哪个事务管理器来标记方法@Transactional.


更新:解决您修改过的问题.您可以指定要在@Transactional注释上使用的事务管理器(请参阅:) @Transactional.value():

@Transactional("transactionManager1")
//...

@Transactional("transactionManager2")
//...
Run Code Online (Sandbox Code Playgroud)

但是我发现您当前的设置有几个问题:

  • <tx:annotation-driven/>使用不同的事务管理器定义两次.我不认为这样的配置是有效的

  • 没有明确提供事务管理器,应该使用哪一个?

我认为应该解决的解决方案是定义<tx:annotation-driven transaction-manager="transactionManager1"/>一次并@Transactional使用第一个管理器并@Transactional("transactionManager2")使用第二个管理器.或者相反.