Spring @具有多个事务管理器和多个数据库的事务
我为SpringBoot应用程序设置了以下内容: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
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") -> {...})
{...}
}