UnexpectedRollbackException:
总结原因:
以下两种情况同时出现(内层事务由spring设置回滚,但外层事务不回滚),则全部回滚并抛出异常:UnexpectedRollbackException:transaction rolled back because it has been marked as rollback-only
1.嵌套事务中(设置事务合并属性propagation="REQUIRED"),里层异常事务回滚,spring会设置 isrollbackonly = true 状态。
2.如果外层事务不设置回滚参数(如rollback-for="Exception”),则默认RuntimeException异常时外层才回滚,但是程序抛出其它异常(如ServiceException等),则外层事务不回滚。或外层处理了异常,则外层事务也不回滚。总之外层不回滚。
避免方法:外层事务设置 rollback-for="Exception”,所有异常都回滚。
备注:
propagation="REQUIRED”的含义是,支持当前已经存在的事务,如果还没有事务,就创建一个新事务。假设调用前不存在任何事务,那么执行时会自动开启一个事务。而由aMethod调用bMethod时,由于事务已经存在,因此会使用已经存在的事务(也就是执行aMethod之前创建的那个事务)。