Transaction rolled back because it has been marked as rollback-only异常问题查询

问题描述

有段aop事务包裹的代码,每次执行完都会报“Transaction rolled back because it has been marked as rollback-only” 异常。

错误原因

上述错误的原因主要在于,一个父事务中包含了多个子事务,父事务和子事务合并成了同一个事务,当其中有子事务代码抛异常并且异常被捕获,并没有继续抛给父事务的话,子事务commit后,状态会被设置为rollback-only;当父事务没有任何错误返回结果时,会检查子事务的状态,发现有回滚状态,则父事务一起进行回滚。

难点

这个问题的难点在于异常被子事务吃掉了,而且并没有打日志出来,这样异常日志就只有上面那句话,不过知道原理后,可以看代码中所有子事务中是否用了try....catch捕获了异常,并且没有抛出来。

教训

在事务中尽量不要各种try...catch;在明确知道错误的情况下才应该进行try...catch;并且需要把所有错误日志打印出来;还需要注意事务嵌套事务之间的传播级别。

你可能感兴趣的:(Transaction rolled back because it has been marked as rollback-only异常问题查询)