最近遇到了事务不回滚的情况,我还考虑说JPA的事务有bug?我想多了…….
为了打印清楚日志,很多方法我都加tyrcatch,在catch中打印日志。但是这边情况来了,当这个方法异常时候日志是打印了,但是加的事务却没有回滚。
例:
类似这样的方法不会回滚(一个方法出错,另一个方法不会回滚):
1
2
3
4
5
6
7
8
|
if (userSave){
try {
userDao.save(user);
userCapabilityQuotaDao.save(capabilityQuota);
} catch (Exception e) {
logger.info( "能力开通接口,开户异常,异常信息:" +e);
}
}
|
1
2
3
4
5
6
7
8
9
|
if (userSave){
try {
userDao.save(user);
userCapabilityQuotaDao.save(capabilityQuota);
} catch (Exception e) {
logger.info( "能力开通接口,开户异常,异常信息:" +e);
throw new RuntimeException();
}
}
|
或者:
1
2
3
4
5
6
7
8
9
|
if (userSave){
try {
userDao.save(user);
userCapabilityQuotaDao.save(capabilityQuota);
} catch (Exception e) {
logger.info( "能力开通接口,开户异常,异常信息:" +e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
|
*****默认spring事务只在发生未被捕获的runtimeexcetpion时才回滚。******
springaop异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常,但可以通过。
换句话说在service的方法中不使用trycatch或者在catch中最后加上thrownewruntimeexcetpion(),这样程序异常时才能被aop捕获进而回滚
解决方案:
方案1.例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加thrownewRuntimeException()语句,以便让aop捕获异常再去回滚,并且在service上层(webservice客户端,view层action)要继续捕获这个异常并处理
方案2.在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常(现在项目的做法)
总结
以上就是本文关于spring事务异常回滚实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
原文链接:http://blog.csdn.net/lee_sire/article/details/72904822
相关文章
- ASP.NET本地开发时常见的配置错误及解决方法? 2025-06-10
- ASP.NET自助建站系统的数据库备份与恢复操作指南 2025-06-10
- 个人网站服务器域名解析设置指南:从购买到绑定全流程 2025-06-10
- 个人网站搭建:如何挑选具有弹性扩展能力的服务器? 2025-06-10
- 个人服务器网站搭建:如何选择适合自己的建站程序或框架? 2025-06-10
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
-
2025-05-29 58
-
2025-05-27 62
-
微信公众平台免费建站是否支持自定义模板?如何选择适合的模板?
2025-06-04 66 -
2025-06-04 95
-
thinkphp6使用mysql悲观锁解决商品超卖问题的实现
2025-05-29 46