【问题标题】:spring multiple transaction manager issue春季多事务管理器问题
【发布时间】:2012-09-26 16:27:20
【问题描述】:

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

【问题讨论】:

    标签: spring transactions


    【解决方案1】:

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

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

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


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

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

    但是我发现您当前的设置存在一些问题:

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

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

    我认为应该可行的解决方案是定义一次&lt;tx:annotation-driven transaction-manager="transactionManager1"/&gt;,然后使用@Transactional 使用第一个经理,使用@Transactional("transactionManager2") 使用第二个。或者反过来。

    【讨论】:

    • 好的,我对我的问题做了一些修改,实际上这就是我面临的问题。
    • 我需要为多个事务管理器定义多个&lt;tx:annotation-driven transaction-manager="yourTxMgrName"/&gt;,否则Spring看不到我的事务管理器。
    猜你喜欢
    • 2012-08-10
    • 1970-01-01
    • 2011-04-22
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 2014-02-19
    • 2014-08-10
    相关资源
    最近更新 更多