Spring事务异常回滚,捕获异常不抛出就不会回滚
推荐:Spring transaction 事务 --Isolation & Progation

Java异常处理主要通过5个关键字控制:try、catch、throw、throws和finally。try的意思是试试它所包含的代码段中是否会发生异常;而catch当有异常时抓住它,并进行相应的处理,使程序不受异常的影响而继续执行下去;throw是在程序中明确引发异常;throws的作用是如果一个方法可以引发异常,而它本身并不对该异常处理,那么它必须将这个异常抛给调用它的方法;finally是无论发不发生异常都要被执行的代码

关键字:throw,throws,try和catch的用法如下:
1、throws出现在方法的声明中,表示该方法可能会抛出的异常,允许throws后面跟着多个异常类型
2、throw出现在方法体中,用于抛出异常。当方法在执行过程中遇到异常情况时,将异常信息封装为异常对象,然后throw。
3、try出现在方法体中,它自身是一个代码块,表示尝试执行代码块的语句。如果在执行过程中有某条语句抛出异常,那么代码块后面的语句将不被执行。
4、catch出现在try代码块的后面,自身也是一个代码块,用于捕获异常try代码块中可能抛出的异常。catch关键字后面紧接着它能捕获的异常类型,所有异常类型的子类异常也能被捕获。

1 try、catch、finally语句中,在如果try语句有return语句,则返回的之后当前try中变量此时对应的值,此后对变量做任何的修改,都不影响try中return的返回值

2 如果finally块中有return 语句,则返回try或catch中的返回语句忽略。

3 如果finally块中抛出异常,则整个try、catch、finally块中抛出异常

所以使用try、catch、finally语句块中需要注意的是

1 尽量在try或者catch中使用return语句。通过finally块中达到对try或者catch返回值修改是不可行的。

2 finally块中避免使用return语句,因为finally块中如果使用return语句,会显示的消化掉try、catch块中的异常信息,屏蔽了错误的发生

3 finally块中避免再次抛出异常,否则整个包含try语句块的方法回抛出异常,并且会消化掉try、catch块中的异常

最近遇到了事务不回滚的情况,我还考虑说JPA的事务有bug? 我想多了…
为了打印清楚日志,很多方法我都加tyr catch,在catch中打印日志。但是这边情况来了,当这个方法异常时候 日志是打印了,但是加的事务却没有回滚。

例:
类似这样的方法不会回滚 (一个方法出错,另一个方法不会回滚) :

if(userSave){
try {
userDao.save(user);
userCapabilityQuotaDao.save(capabilityQuota);
} catch (Exception e) {
logger.info(“能力开通接口,开户异常,异常信息:”+e);
}
}

下面的方法回滚(一个方法出错,另一个方法会回滚):

if(userSave){
try {
userDao.save(user);
userCapabilityQuotaDao.save(capabilityQuota);
} catch (Exception e) {
logger.info(“能力开通接口,开户异常,异常信息:”+e);
throw new RuntimeException();
}
}
或者:

if(userSave){
try {
userDao.save(user);
userCapabilityQuotaDao.save(capabilityQuota);
} catch (Exception e) {
logger.info(“能力开通接口,开户异常,异常信息:”+e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}

为什么不会滚呢??是对Spring的事务机制就不明白。!!
默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚。
spring aop 异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常,但可以通过
配置来捕获特定的异常并回滚
换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new runtimeexcetpion(),这样程序异常时才能被aop捕获进而回滚

将异常捕获,并且在catch块中不对事务做显式提交(或其他应该做的操作如关闭资源等)=生吞掉异常;

spring的事务边界是在调用业务方法之前开始的,业务方法执行完毕之后来执行commit or rollback(Spring默认取决于是否抛出runtime异常).
如果抛出runtime exception 并在你的业务方法中没有catch到的话,事务会回滚。
一般不需要在业务方法中catch异常,如果非要catch,在做完你想做的工作后(比如关闭文件等)一定要抛出runtime exception,否则spring会将你的操作commit,这样就会产生脏数据.所以你的catch代码是画蛇添足。

由此可以推知,在spring中如果某个业务方法被一个

 try {   //bisiness logic code   } catch(Exception e) {   //handle the exception

整个包裹起来,则这个业务方法也就等于脱离了spring事务的管理,因为没有任何异常会从业务方法中抛出!全被捕获并吞掉,导致spring异常抛出触发事务回滚策略失效。

不过,如果在catch代码块中采用页面硬编码的方式使用spring api对事务做显式的回滚,这样写也未尝不可。

解决方案:
方案1.例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加throw new RuntimeException()语句,以便让aop捕获异常再去回滚,并且在service上层(webservice客户端,view层action)要继续捕获这个异常并处理
方案2.在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常(现在项目的做法)

作者:杰克思勒
出处:http://www.cnblogs.com/tufujie/
如果您觉得阅读本文对您有帮助,请点击一下右下方的推荐按钮,您的推荐将是我写作的最大动力!
版权声明:本文为博主原创或转载文章,欢迎转载,但转载文章之后必须在文章页面明显位置注明出处,否则保留追究法律责任的权利。

(转)Spring事务异常回滚机制(出处在文末,转自李慕白大神)相关推荐

  1. Spring事务异常回滚,捕获异常不抛出就不会回滚

    Spring事务异常回滚,捕获异常不抛出就不会回滚 参考文章: (1)Spring事务异常回滚,捕获异常不抛出就不会回滚 (2)https://www.cnblogs.com/chen-lhx/p/6 ...

  2. Spring事务异常回滚,try catch 捕获异常不回滚

    Spring事务异常回滚,try catch 捕获异常不回滚 参考文章: (1)Spring事务异常回滚,try catch 捕获异常不回滚 (2)https://www.cnblogs.com/GH ...

  3. Spring 事务提交回滚源码解析

    2019独角兽企业重金招聘Python工程师标准>>> 前言 在上篇文章 Spring 事务初始化源码分析 中分析了 Spring 事务初始化的一个过程,当初始化完成后,Spring ...

  4. spring事务手动回滚

    近期改已离职员工的代码,发现很多地方存在事务的逻辑性错误,比如: 在已对数据库进行一次增删改的情况下,在下一步增删改中如果执行失败,他直接就返回一个包含错误code的ResultMap的结果集回去(这 ...

  5. [事务] 事务的回滚机制

    SpringBoot提供了非常方便的事务操作,通过注解就可以实现事务的回滚,下面我们就说一下如何进行事务操作 1. 事务说明 在Spring中,事务有两种实现方式,分别是编程式事务管理和声明式事务管理 ...

  6. oracle 事务未正常回滚,Spring事务没有回滚异常(Oracle JNDI数据源)

    我在 Spring MVC 3.1项目中使用基于注释的事务,并且在抛出异常时我的事务没有被回滚. 这是我的服务代码 @Service public class ImportService { @Aut ...

  7. Spring 事务不回滚

    为了打印清楚日志,很多方法我都加tyr catch,在catch中打印日志.但是这边情况来了,当这个方法异常时候 日志是打印了,但是加的事务却没有回滚. 例:      类似这样的方法不会回滚 (一个 ...

  8. spring事务提交回滚原理mybatis版

    sping事务非常简单好用,不用手动提交回滚事务,比如下面代码将2个更新操作一同提交,一同回滚. 上述代码基本没有任何有关jdbc事务的操作, 但却能将2个数据库更新操作同时提交与回滚,这是个值得思考 ...

  9. java 自定义异常 未回滚_抛出自定义异常,spring AOP事务不回滚的解决方案

    spring AOP 默认对RuntimeException()异常或是其子类进行事务回滚,也就是说 事务回滚:throw new RuntimeException("xxxxxxxxxxx ...

  10. sqlsever回滚操作_sqlserver事务与回滚

    如果要在Production执行数据改动必须小心,可以使用事务提前验证一下自己写的SQL是不是你期望的.尤其是Update的where 条件有问题的话,跟新的记录就会超出预期的范围.如下面的语句,一着 ...

最新文章

  1. mysql 5.1 禁用innodb
  2. BCH表现良好,BTC调整蓄势
  3. python在中小学教学中的应用-中小学Python编程语言教学
  4. opencv 标记有数字的区域
  5. 备忘:C++基础 -- 数据类型的学习总结
  6. ES6之let和const
  7. zabbix基础之环境搭建
  8. 内卷的世界,我们是否可以换一种思维生活?
  9. java yeild_Java 中 Thread.yield() 方法详解
  10. 生成.o linux,JaxoDraw下载 费曼图生成工具JaxoDraw for linux v2.1.0 官方安装版 下载-脚本之家...
  11. Python工作笔记001---python3的print加括号_Python3中不存在raw_input( )了
  12. arp协议的主要功能是_计算机网络之ARP协议
  13. jq 检测元素内html变化,jq 监听 textarea 元素内容变化的方法
  14. Kafka 日志消息保存时间
  15. linux内存不足,swap交换分区创建
  16. 一个计算机自动作图程序
  17. grid 安装失败 卸载grid 实操
  18. Windows8 照片查看器,图片发黄解决方法~
  19. 小练习 用python实现最简单的人工智能
  20. 逻辑回归模型——股票客户流失预警模型

热门文章

  1. java.util.Date中的loe_有趣的widget-日期和时间
  2. 截止到某天的汇总报表_excel表格日数据汇总-excel表中如何将每日的数据汇总到每周...
  3. java图像压缩文件大小通过 thumbnailator-0.4.2-all.jar 进行压缩调用简单 jpg格式
  4. 案例分析默写题1__立项管理_可行性研究的内容_可行性研究报告的内容
  5. 论技术交流的重要性,两个PMOS管背靠背用法详解
  6. Excel QUARTILE函数计算逻辑
  7. 你不会还不知道数组里面有这些好用的方法吧!(JavaScript)
  8. 【视频检测】Flow-Guided Feature Aggregation for Video Object Detection
  9. [Tableau] Tableau知识技能
  10. idea打断点是白色的