问题描述
作为一项事务的一部分,我必须更新两个数据源.那就是——
I have to update two data sources as part of one transaction. That is -
- 我在 DB1 中进行了更新.
- 然后,我在 DB2 中进行了另一次更新.
如果在 DB2 中更新失败,我想回滚 DB1 和 DB2 以回滚.这可以使用@Transactional 来完成吗?
If update in DB2 fails, I want to roll back both DB1 and DB2 to roll back. Can this be accomplished using @Transactional ?
这是一个示例代码 -
Here is a sample code -
@Transactional(value="db01TransactionManager")
public void updateDb01() {
Entity01 entity01 = repository01.findOne(1234);
entity01.setName("Name");
repository01.save(entity01);
//Calling method to update DB02
updateDb02();
}
@Transactional(value="db02TransactionManager")
public void updateDb02() {
Entity02 entity02 = repository02.findOne(1234);
entity02.setName("Name");
repository02.save(entity02);
//Added this to force a roll back for testing
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
我的问题是,updateDb02 中的 setRollbackOnly() 仅回滚 Db01 事务.
My problem is that, the setRollbackOnly() in updateDb02 rolls back only the the Db01 transaction.
推荐答案
我已经使用 ChainedTransactionManager 解决了这个问题 - http://docs.spring.io/spring-data/commons/docs/1.6.2.RELEASE/api/org/springframework/data/transaction/ChainedTransactionManager.html
I've solved this problem using ChainedTransactionManager - http://docs.spring.io/spring-data/commons/docs/1.6.2.RELEASE/api/org/springframework/data/transaction/ChainedTransactionManager.html
Spring Boot 配置:
Spring Boot Configuration:
@Bean(name = "chainedTransactionManager")
public ChainedTransactionManager transactionManager(@Qualifier("primaryDs") PlatformTransactionManager ds1,
@Qualifier("secondaryDs") PlatformTransactionManager ds2) {
return new ChainedTransactionManager(ds1, ds2);
}
然后你可以这样使用它:
And then you can use it as follows:
@Transactional(value="chainedTransactionManager")
public void updateDb01() {
Entity01 entity01 = repository01.findOne(1234);
entity01.setName("Name");
repository01.save(entity01);
//Calling method to update DB02
updateDb02();
}
public void updateDb02() {
Entity02 entity02 = repository02.findOne(1234);
entity02.setName("Name");
repository02.save(entity02);
//Added this to force a roll back for testing
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
这篇关于Spring @Transactional 具有跨多个数据源的事务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!