一、错误发生。
项目中有下面这段代码:箭头表示的2个方法都有事务,外面的事务捕获了里面的事务。
当内层的事务方法异常时,运行后会报错:Could not commit JPA transaction RollbackException: Transaction marked as rollbackOnly
二、错误原因:
在一个transactional中如果有另一transaction,内层的事务会跟随外层的事务,变为一个整体的事务。
如果内层transaction发生了异常,即使你捕捉了这个异常,那么整体的Transaction也会被定义成RollbackOnly,这也正是事务管理的原则。所以当外层事务想提交整个事务时,出现异常。
二、解决方式:
把外面的transactional去掉。或者内层事务部跟随外层事务,内层事务定义为 requires_new,内层新启一个事务。
@Transactional(Transactional.TxType.REQUIRES_NEW)