@Transactional 具有多个事务管理器和多个数据库

Posted

技术标签:

【中文标题】@Transactional 具有多个事务管理器和多个数据库【英文标题】:@Transactional with multiple Transaction Manager and multiple databases 【发布时间】:2019-07-02 07:58:39 【问题描述】:

我为 SpringBoot 应用程序设置了以下内容:

    Database1 - TransactionManagerDatabase1

    Database2 - TransactionManagerDatabase2

    Transactional(value = "TransactionManagerDatabase1", readOnly = true)
     public void getResults() 
       // select a row from table in Database1
       // select a row from table in Database2
    
     DataSource dataSourceDB2 = SpringContextProvider.getApplicationContext().getBean("TransactionManagerDatabase2", DataSource.class);       
     dataSourceDB2.getPool().getActive(); //This is returning an active connection with Database2
    
    
    

Database1申请@Transactional时,Database2怎么还能保持活动连接??

【问题讨论】:

【参考方案1】:

据此:Transaction management for multiple database Using Spring & Hibernate

您可以像这样指定多个 TM:

<bean>
  <bean id="transactionManager1"
    class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory1" />
    <qualifier value="account"/>
</bean>

<bean id="transactionManager2"
    class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory2" />
    <qualifier value="businessData"/>
</bean>

然后您可以这样做来指定您需要的 TM:

public class TransactionalService 

  @Transactional("account")
  public void setSomethingInAccount()  ... 

  @Transactional("businessData")
  public void doSomethingInBusinessData()  ... 

public class TransactionalService 

      @Transactional("businessData")
      public void doSomethingInBusinessData(
      @Transactional
      ("account") -> ...) 
      ...
    

【讨论】:

我需要在一个方法中调用两个数据库并在其中一个上使用事务。 我编辑了答案以包含一个 lambda 表达式。这将达到相同的结局,但只使用一种方法。该代码未经测试,但总体思路可能对您有所帮助。或者,您可以将这两个方法设为静态,并创建第三个方法来调用这两个方法。

以上是关于@Transactional 具有多个事务管理器和多个数据库的主要内容,如果未能解决你的问题,请参考以下文章

Spring @Transactional 与跨多个数据源的事务

具有@async超时值的Spring @transactional不起作用

SpringBoot之事务管理Transactional

Spring @Transactional 浅谈

spring配置添加多个事务(转)

每日必读DZone Spring:Spring @Transactional 是如何真正工作的?