本人遇到的spring事务之UnexpectedRollbackException异常解决笔记
来源:互联网 发布:淘宝电影优惠券 编辑:程序博客网 时间:2024/05/16 00:35
本人最近在使用spring事务管理的过程中遇到如下异常,导致服务端抛出500给前端,让搞前端的哥们抱怨我心里着实不爽,前前后后折腾了近半个小时才得于解决,今天就做个笔记,以免日后又犯这个错误。好了,错误是这样的:
org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only
后来才发现,我这个问题在ssh或者ssm之类的框架下其实是具有一定的普遍性的。上述异常一般都会出现在下述java伪代码描述的场景中:
在ssh或者ssm等框架集成的项目中,通常service层的事务是由spring代理的。service层的方法发生或抛出异常,则事务会回滚,导致无法提交。通常,我们的项目都会设有全局的异常处理机制,一旦发生异常,会有全局的异常处理机制进行统一处理,所以一般不需要在代码中主动捕获异常。
然而,某些特殊的场景中,比如下面的业务层serviceA具有方法methodA,methodA会调用另一个业务层serviceB的方法methodB。在methodA的实际执行过程中,假如methodB有可能抛出异常,但在methodB无论执行是否正常都不能影响methodA的执行的情况下,通常需要methodA主动捕获这个异常。在methodA主动捕获这个异常的情况下,只要methodA的其他代码不抛出异常,则methodA是不会抛出任何异常的。既然methodA不会抛出异常,道理上讲作用于methodA上的事务是应该可以正常提交的呀,对不对?然而事实上,一旦methodB抛出异常,不管methodA的其他代码是否正确执行,整个事务是无法提交的(说这句话的前提是methodA和methodB上都具有事务,并且都由spring进行统一的事务管理)。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
出现上述异常是因为自己之前没有很好的理解spring事务的机制。 上述的methodA被调用执行时,有两个点是被spring事务代理的。也即serviceA.methodA()和serviceB.methodB(),这两个方法中只要有异常事件将回滚。 上述场景中存在事务嵌套,如果methodA中有异常出现事务会直接回滚,但methodB中有异常只是标记状态为需要回滚,最终在methodA中回滚。 上述场景中methodB有异常事务被标记为回滚,可是被methodA捕获了,也就不回滚了,一直执行到最后commit。在commit时spring会判断回滚标志,若检测到存在回滚标记, 则回滚事务并抛出UnexpectedRollbackException异常。
针对上述事务无法提交的解决办法,本人现在总结了两种处理方法,有路过的看到过的,要是还有什么较好的解决方法,不妨给本人留言,大家共同探讨,一起进步吧!言归正传,本人的总结出的这两种解决方法描述如下:
serviceB.methodB不声明为事务代理。 但是很多时候serviceB.methodB也被其他地方使用,并且是需要事务管理的。这时候可以重写一个方法。但是要注意这个方法中数据的一致性。
和1一样也是重写一个serviceB.methodB方法,但在里面不抛出异常,而是将异常转化为一个布尔值并返回,这个返回的布尔值相当于一个标记methodB是否在执行过程中出现异常的状态值。methodA可以根据这个返回的状态值判断后续代码是否有必要继续执行。这样,也可以避免上述异常的产生。
- 本人遇到的spring事务之UnexpectedRollbackException异常解决笔记
- 本人遇到的spring事务之UnexpectedRollbackException异常解决笔记
- Spring事务 UnexpectedRollbackException
- 一个UnexpectedRollbackException异常解决
- spring:org.springframework.transaction.UnexpectedRollbackException解决
- spring笔记之事务
- spring 的异常驱动的事务回滚之谜
- Spring事务管理UnexpectedRollbackException
- spring事务管理UnexpectedRollbackException
- Spring事务管理UnexpectedRollbackException
- spring事务管理UnexpectedRollbackException
- Spring事务异常rollback-only 笔记
- Spring 学习笔记 (IV) 之 Spring 的事务
- 本人在使用PopupMenu,遇到的问题,和解决过程
- Spring Demo遇到的异常
- 解决Spring的声明式事务中的自定义异常不回滚问题
- spring 事务中遇到的----奇异问题
- Spring事务管理所遇到的坑
- OpenCV人脸识别之二:模型训练
- 零基础入门深度学习 | 第一章:感知器
- Matrix Power Series
- Ant笔记(一)Ant下载与安装
- 关于配置文件中的头约束问题 xsd 版本不对应
- 本人遇到的spring事务之UnexpectedRollbackException异常解决笔记
- linux:vi 替换命令
- webview显示为空白页面解决方法,对h5支持
- ESP8285调试 IOT_Demo
- ANR, at java.lang.ProcessManager.exec(ProcessManager.java:206)
- [自定义TableViewCell的删除视图 + iOS11下自定义删除失效适配]
- 前端如何展示商品属性:SKU多维属性状态判断算法的应用-Vue 实现
- Hexo网站的恢复策略
- String.equals()源码分析