spring service方法抛出runtimeException但不回滚

发布于 2022-09-07 16:00:41 字数 824 浏览 18 评论 0

定义了一个service:UserService其中有个方法定义如下:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveException(User user){
    userDao.save(user);
    throw new RuntimeException("异常");
}

如果我在Controller层直接调用这个方法,是可以进行回滚的,但如果我把这个方法再包一层,如下:


public void saveInnerException() {
    User user1 = new User();
    user1.setName("李四");
    this.saveException(user1);
}    

saveInnerException还是在同一个service中,并且这个方法没有加事务,这个时候,如果Controller层调用saveInnerException方法,事务会进行提交,这个很奇怪,发生了异常,应该回滚才对。
我又进行了另外的测试,这次我重新定义了一个service:UserService2,里边有个非事务方法,如下:

public void test(){
    User user = new User();
    user.setName("李四");
    userService.saveException(user);
}   

如果Controller调用UserService2的test方法,这时事务就会回滚了。同样是多了一层调用,结果为什么不一样?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梨涡少年 2022-09-14 16:00:41

不奇怪,
默认Spring事务只会从public方法,并且被外部类调用时才会有效(触发),大概原理是用了代理调用时,调用前后分别执行了对应的事务处理逻辑。
如果是内部调用,则无法正常的通过代理方式执行,也即事务的相关处理没有作用。
同样的还有一些其他的通过代理实现的,如@Async

热鲨 2022-09-14 16:00:41

问题出在saveInnerException方法里的this
你不信单步调试跟踪下,你会发现this就是个普通实例而不是aop增强过的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文