org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only
原因:spring事务嵌套,内层异常被外层try-catch,外层正常commit,或者内层手动设置回滚
例1:内层事务手动回滚
@Transactional(rollbackFor = Exception.class)
public void insert() {
userService.m1();
}
@Transactional(rollbackFor = Exception.class)
public void m1() {
//手动设置事务回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
例2:外层try-catch内层异常
@Transactional(rollbackFor = Exception.class)
public void add() {
try {//外层进行try-catch
userService.m2();
} catch (Exception e) {
log.error("111",e);
}
}
@Transactional(rollbackFor = Exception.class)
public void m2() {
mapper.insert(new User());
//内层抛出异常
throw new RuntimeException("aaa");
}
解决方法
- 去掉任意一个方法的事务注解
- 外层try-catch转为对内层的方法try-catch
- 设置不同的propagation
- 手动回滚改抛异常,外层不捕获