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

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

  1. Database1 - TransactionManagerDatabase1
  2. 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怎么还能保持活动连接??

【问题讨论】:

    标签: spring spring-boot spring-data-jpa spring-transactions


    【解决方案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 表达式。这将达到相同的结局,但只使用一种方法。该代码未经测试,但总体思路可能对您有所帮助。或者,您可以将这两个方法设为静态,并创建第三个方法来调用这两个方法。
    猜你喜欢
    • 2011-03-20
    • 1970-01-01
    • 2014-05-27
    • 2023-02-16
    • 2022-09-27
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 2016-07-21
    相关资源
    最近更新 更多