spring多个事务管理器问题

时间:2012-09-26 16:27:21

标签: spring transactions

我在两个单独的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() { ... }
}

1 个答案:

答案 0 :(得分:14)

从官方文档中查看11.5.6 Using @Transactional

  

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

由于您的所有事务管理器都没有命名为transactionManager,因此您必须指定哪个事务管理器应该用于标有@Transactional的方法。


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

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

@Transactional("transactionManager2")
//...

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

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

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

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