意外と知られていない。SpringBoot のもう一つのPlatformTransactionManager
それは:org.springframework.data.transaction.ChainedTransactionManager です。
使用するイメージ
@Bean(name = "chainedTransactionManager")
public ChainedTransactionManager transactionManager(@Qualifier("primaryDs") PlatformTransactionManager ds1,
@Qualifier("secondaryDs") PlatformTransactionManager ds2) {
return new ChainedTransactionManager(ds1, ds2);
}
@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();
}
要するに、DS1とDS2を同時にコミット/ロールバックできることです。
DS1 -> insert -> OK
DS2 -> update -> OK
DS1,DS2 -> commit
DS1 -> insert -> OK
DS2 -> update -> NG
DS1,DS2 -> rollback