spring service方法抛出runtimeException但不回滚
定义了一个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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不奇怪,
默认Spring事务只会从public方法,并且被外部类调用时才会有效(触发),大概原理是用了代理调用时,调用前后分别执行了对应的事务处理逻辑。
如果是内部调用,则无法正常的通过代理方式执行,也即事务的相关处理没有作用。
同样的还有一些其他的通过代理实现的,如@Async
问题出在saveInnerException方法里的this
你不信单步调试跟踪下,你会发现this就是个普通实例而不是aop增强过的