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

Spring @具有多个事务管理器和多个数据库的事务,spring,spring-boot,spring-data-jpa,spring-transactions,Spring,Spring Boot,Spring Data Jpa,Spring Transactions,我为SpringBoot应用程序设置了以下内容: 数据库1-TransactionManagerDatabase1 数据库2-TransactionManagerDatabase2 Transactional(value = "TransactionManagerDatabase1", readOnly = true) public void getResults() { // select a row from table in Database1 // select a row

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

  • 数据库1-TransactionManagerDatabase1
  • 数据库2-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
    
    }
    
  • @Transactional
    应用于数据库1时,数据库2如何仍然保持活动连接???

    根据以下内容:

    您可以指定多个TMs,如下所示:

    <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>
    
    据此:

    您可以指定多个TMs,如下所示:

    <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>
    

    我需要在一个方法中调用这两个数据库&对其中一个使用事务。我编辑了答案以包含lambda表达式。这将达到同样的结局,但只使用一种方法。该代码未经测试,但总体思路可能会对您有所帮助。或者,您可以将这两个方法都设置为静态,并设置第三个方法来调用这两个方法。我需要在一个方法中调用这两个数据库&在其中一个方法上使用事务。我编辑了答案以包含lambda表达式。这将达到同样的结局,但只使用一种方法。该代码未经测试,但总体思路可能会对您有所帮助。或者,您可以使这两个方法都是静态的,并使第三个方法调用这两个方法。
    public class TransactionalService {
    
          @Transactional("businessData")
          public void doSomethingInBusinessData(
          @Transactional
          ("account") -> {...}) 
          {...}
        }