Java Spring Boot:具有两个DB的事务,如果第二个DB失败,则回滚第一个DB
我正在构建一个具有两个数据源的Spring引导应用程序。我需要在DB1中进行更新,然后在DB2中进行更新。但如果DB2的更新失败,DB1更新应该回滚 我也看到过同样的问题,但是ChainedTransactionManager实现对我不起作用 我目前的做法是: 我为事务管理器提供了两个具有不同数据源的bean: 我有两种事务性方法来进行更新。出于某种奇怪的原因,@Transactional注释在任何方法中都不起作用。但到目前为止,这两种方法在其数据源中运行良好 对于第一个DB: @凌驾 公共布尔更新B1{ transactionTemplate.setTransactionManagerdataSourceTransactionManagerSP; 返回transactionTemplate.executestatus->{ 布尔值r1=repository1.update1; 布尔r2=repository1.update2; 返回r1和r2; }; } 对于第二个DB: @凌驾 公共布尔更新B2{ transactionTemplate.setTransactionManagerdataSourceTransactionManagerBOL; 返回transactionTemplate.executestatus->{ 布尔值r1=repository2.update1; 布尔值r2=repository2.update2; 返回r1和r2; }; } 但现在我需要一个调用updateDB1和updateDB2的方法,如果DB2失败,DB1将回滚 @凌驾 公共布尔更新框{ 返回transactionTemplate.executestatus->{ 布尔r1=更新的b1; 布尔r2=更新的b2; 返回r1和r2; }; }Java Spring Boot:具有两个DB的事务,如果第二个DB失败,则回滚第一个DB,java,spring,datasource,jdbctemplate,transactional,Java,Spring,Datasource,Jdbctemplate,Transactional,我正在构建一个具有两个数据源的Spring引导应用程序。我需要在DB1中进行更新,然后在DB2中进行更新。但如果DB2的更新失败,DB1更新应该回滚 我也看到过同样的问题,但是ChainedTransactionManager实现对我不起作用 我目前的做法是: 我为事务管理器提供了两个具有不同数据源的bean: 我有两种事务性方法来进行更新。出于某种奇怪的原因,@Transactional注释在任何方法中都不起作用。但到目前为止,这两种方法在其数据源中运行良好 对于第一个DB: @凌驾 公共布尔
我知道这不起作用,因为我需要指定TransactionManager,但这就是问题所在,我有两个事务管理器。我认为您应该使用相同的方法updateBoth来控制回滚DB1。在spring Doc中,您可以找到以下示例:
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
try {
updateOperation1();this is your updateDB1()
updateOperation2();-->this is your updateDB2()
} catch (SomeBusinessExeption ex) {
status.setRollbackOnly();
}
}
});
我会让updateDB2启动一些自定义异常,这些异常可能会在捕获中被捕获,然后使状态回滚。在本例中,假设您希望手动回滚的是DB1,那么要使用的事务管理器是DataSourceTransactionManager SP DB1。您可以使用@TransactionaldataSourceTransactionManagerBOL控制DB2的事务,谢谢!你能分享一下你发现这个的Spring文档吗?当然,给你:你的答案帮助我找到了解决方案:。最后,我创建了一个仅适用于DB1的新事务模板,创建了该事务,并在其中创建了另一个适用于DB2的事务模板。如果DB2失败,我抛出第一个transactionTemplate捕获的异常,回滚工作。谢谢!