【问题标题】:How to separate two transactions calling each other in Spring如何在Spring中分离两个相互调用的事务
【发布时间】:2021-10-16 16:57:29
【问题描述】:

我有一个从事务 A 到事务 B 的调用并且事务 B 失败,如何只在事务 B 中回滚而不在事务 A 中回滚

@Autowired
ResourceServiceImpl resourceService;
// transaction A
@Transactional(propagation = Propagation.REQUIRES_NEW, noRollbackFor = RuntimeException.class)
void syncRestApi() {
    for (RoleResourceRelation roleResourceRelation : roleResourceRelations) {
        roleResourceRelationMapper.save(roleResourceRelation);
    }
   //call transaction B
    try {
        resourceService.test();
    } catch (Exception e) {

    }
}


@Service
@Transactional
public class ResourceServiceImpl {

  //transaction B
  public void test(){
    throw new RuntimeException("");
  }
}

谢谢

【问题讨论】:

    标签: java spring spring-boot spring-transactions


    【解决方案1】:

    你在 B 中抛出了一个 RuntimeException,这将导致 A 的事务回滚。

    所以你必须在 A 中捕获这个异常,或者你必须将 RuntimeException 配置为不回滚 (noRollbackFor),但这不是一个好主意,因为这可能会导致问题。

    【讨论】:

    • 我按照您的指示尝试了,但我仍然收到消息“事务已回滚,因为它已被标记为仅回滚”,我再次更新了我的代码
    • 如果我将 Propagation.REQUIRES_NEW 添加到 B 问题就解决了,但是由于 B 是共享的,我不能这样做
    • 哦,是的,我忘了添加 REQURIES_NEW。如果在其他情况下事务行为不同,则共享它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2016-07-07
    • 2022-07-20
    • 1970-01-01
    相关资源
    最近更新 更多