首页 > 解决方案 > @Transactional 具有多个事务管理器和多个数据库

问题描述

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

  1. 数据库 1 - 事务管理器数据库 1
  2. 数据库 2 - 事务管理器数据库 2

    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
    
    }
    

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

标签: springspring-bootspring-data-jpaspring-transactions

解决方案


据此:使用 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") -> {...}) 
      {...}
    }

推荐阅读