踩坑日记-Transaction rolled back because it has been marked as rollback-only
使用场景:
方法A调用方法B,方法A上加了@Transactional注解,方法B上也加了@Transactional注解,方法B会抛出异常,方法A捕获到异常但是不抛出,就会出现这个报错。
@Transactional public ReturnType A(Object object){ //业务代码... try{ B(Object); }catch(Exception e){ //捕获执行过程中出现的任何异常,且正常返回 return new ReturnType(); } } @Transactional public void B(Object object){ try{ //执行业务操作 }catch(Exception e){ //记录日志 throw e; } }
原因
@Transactional注解是基于AOP实现的,且是可继承的,A和B实际上是在同一个事务中,加上@Transactional注解后会在方法结束之后执行commit/rollback。方法B抛出了异常,此时事务状态被设置成了rollback,而上层A方法却没有将这个异常抛出去,此时事务认为应该commit,就会报错。
解决
方法B新启一个事务,改为@Transactional(propagation = Propagation.REQUIRES_NEW)
浙公网安备 33010602011771号