此错误原因看代码:
@Transactional
public void a() {
try {
b();
} catch (Exception e) {
e.printStackTrace();
}
//此处执行完毕,默认commit事务
}
@Transactional
public void b() {
int i = 1/0;//此处抛异常
}
a方法和b方法都带注解事务@Transactional,在事务a方法中调用了事务b方法,在b方法中抛出异常,b方法回滚。根据默认事务传播,a和b方法都使用外层a的事务,也就是说两个方法在一个事务中。
但是b方法报错了以后被外层a方法try到后,继续执行。最后a方法执行完毕并没有向上再抛出异常,最后默认事务提交。这时会报出标题的错误。
因为b方法报错了标记要回滚,但是a方法没有报错标记提交,两个标识产生冲突。此时抛出错误但是两个方法还是回滚了,业务逻辑正常。
如果业务需要b方法报错b回滚,a方法报错a才回滚。请查看spring事务7传播,其中带参数的注解@Transactional(propagation = Propagation.REQUIRES_NEW)是各自回滚或提交,内外层方法不影响。