Java @Transactional事务嵌套异常,报错Transaction rolled back because it has been marked as rollback-only
一、概述
事务不生效,try case 没有包住异常信息,导致case了以后还继续报错,问题是因为事务嵌套异常导致的。是什么原因出现的,如何解决 Transaction rolled back because it has been marked as rollback-only 翻译为:事务回滚,因为它被标记为仅回滚。
二、出问题的代码
@Transactional
@Override
public boolean A(User user) {
try {
userMapper.B(user);
} case {
//这里做了保存,没有继续向上抛错
}
}
@Transactional
@Override
public boolean B(User user) {
.....
int i = 1/0; /这里报错了
return false;
}
三、原因
A调用B的时候,B方法抛错了,被记录上需要进行异常回滚了,但是方法返回给A的时候,A接受到了异常,并想在case中处理,并不继续抛出异常,在A进行提交时,事务不允许进行提交,因为B执行的时候就标记上此事务需要回滚,会直接抛出 Transaction rolled back because it has been marked as rollback-only
四、解决思路
1、在B方法中进行try case case中不进行抛错处理
2、在A方法case中继续抛错处理
3、在B方法上的Transaction 添加事务传播规则为 propagation = Propagation.REQUIRES_NEW 新建事务进行处理
4、将A方法上的Transaction事务去掉
可以根据自己的场景进行处理。