gpt4 book ai didi

Spring @Transactional 具有跨多个数据源的事务

转载 作者:行者123 更新时间:2023-12-03 04:07:05 26 4
gpt4 key购买 nike

我必须在一项事务中更新两个数据源。那就是-

  1. 我在 DB1 中进行了更新。
  2. 然后,我在 DB2 中进行另一次更新。

如果DB2中的更新失败,我想回滚DB1和DB2来回滚。这可以使用 @Transactional 来完成吗?

这是一个示例代码 -

@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 事务。

最佳答案

我已经使用 ChainedTransactionManager 解决了这个问题 - http://docs.spring.io/spring-data/commons/docs/1.6.2.RELEASE/api/org/springframework/data/transaction/ChainedTransactionManager.html

Spring 启动配置:

    @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();
}

关于Spring @Transactional 具有跨多个数据源的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48954763/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com