首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA回滚嵌套事务

JPA回滚嵌套事务
EN

Stack Overflow用户
提问于 2021-10-19 13:45:31
回答 2查看 81关注 0票数 0

如何回滚嵌套事务?假设如果method5中有异常,那么如何也回滚method4更改。

代码语言:javascript
复制
@Singleton
public class Case {
   @Inject
   CaseService caseService;
    
    @Transactional
    void method2(){
        var value = caseService.method4();
        caseService.method5(value);
    }
}

@Singleton
public class CaseService {
    @Transactional(Transactional.TxType.REQUIRES_NEW)
    public String method4(){
        return "some";
    }
    
    @Transactional(Transactional.TxType.REQUIRES_NEW)
    public void method5(String value){
    }
}
EN

回答 2

Stack Overflow用户

发布于 2021-10-20 13:49:44

如果您想回滚method4调用,那么它的语句应该与method5在同一个事务中。

在您提供的代码中,method4method5始终在单独的事务中执行。

因此,您可以删除REQUIRES_NEW属性。

票数 0
EN

Stack Overflow用户

发布于 2021-10-20 14:02:28

REQUIRES_NEW将始终创建新事务,而不考虑以前的任何事务。因此,任何回滚都将只发生在该事务上。你想要所有的(method4method5)意味着method2应该是原子的。在这种情况下,所有这些都应该在相同的事务下,这意味着你只需要使用REQUIRED,或者根据你的用例在method2method4method5上启动一个新的事务。

如果您的任何事务性方法抛出RuntimeException,那么它们将自动回滚。如果您还期望检查异常的回滚,那么您需要在注释中提到这一点。

(rollbackFor=CustomException.class)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69632021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档