spring事务回滚异常问题总结


UnexpectedRollbackException:

分析原文:http://m.blog.csdn.net/article/details?id=51214266

总结原因:

以下两种情况同时出现(内层事务由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之前创建的那个事务)。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM