7

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

1 回答 1

17

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

如果要连接的 bean 名称具有 name ,则可以省略标记transaction-manager中的属性。如果您要依赖注入的 bean 有任何其他名称,那么您必须显式使用该属性 [...]<tx:annotation-driven/>PlatformTransactionManagertransactionManagerPlatformTransactionManagertransaction-manager

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


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

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

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

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

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

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

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

于 2012-09-26T16:39:49.493 回答