首页 > 解决方案 > 如何在Spring中分离两个相互调用的事务

问题描述

我有一个从事务 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("");
  }
}

谢谢你

标签: javaspringspring-bootspring-transactions

解决方案


您在 B 中抛出 RuntimeException 将导致 A 回滚事务。

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


推荐阅读