Spring-Java事物回滚失效处理最近在做项目中,无意间发现有个类在抛事物回滚操作,数据也正常的插入到数据库当中了,于是仔细查看看一下具体原因。

一切还是要从Java的检查型异常和非检查型异常说起。

那么什么是检查型异常什么又是非检查型异常呢?
 最简单的判断点有两个:
    1.继承自RuntimeException或Error的是非检查型异常,而继承自Exception的则是检查型异常(当然,RuntimeException本身也是Exception的子类)。
    2.对非检查型类异常可以不用捕获,而检查型异常则必须用try……catch语句块进行处理或者把异常交给上级方法处理,总之就是必须写代码处理它。

Java 的异常结构如下图。其中直接继承Exception的异常,必须捕获,属于检查型异常。

再回过来看我的代码:

1、方法名前面有

[java] view plain copy
  1. @Transactional

2、Spring的配置文件applicationContext-XXX.xml当中也有Spring事物的相关配置

[html] view plain copy
  1. <bean id="transactionManager"
  2. class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  3. <property name="dataSource" ref="dataSource" />
  4. <property name="rollbackOnCommitFailure" value="true"></property>
  5. </bean>

但是为什么在Service层方法调用的时候,try……catch抛Exception异常已经提交的事物却没有回滚?

查看相关spring的文档后发现,原来spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作。

代码中try……catch抛出的Exception异常,属于检查型异常,Spring的框架默认是不会进行回滚的。

在编程中对非检查型类异常可以不用捕获,而检查型异常则必须用try语句块进行处理或者把异常交给上级方法处理总之就是必须写代码处理它。

所以必须在service捕获异常,然后再次手动 throw 一个非检查型异常,这样事务方才起效。例如:

[java] view plain copy
  1. try{
  2. …………
  3. } catch (Exception e) {
  4. …………
  5. throw new BusinessException(e.getMessage());
  6. }

当然我们还有更简便的方法来解决这个问题,那就是通过注解参数改变默认的回滚方式 。

在@Transaction注解中定义了noRollbackFor和RollbackFor来指定某种异常是否回滚。

使用例:

@Transaction(noRollbackFor=RuntimeException.class)

@Transaction(RollbackFor=Exception.class)

所以上述的问题可以直接将@Transaction添加回滚参数@Transaction(RollbackFor=Exception.class) ,这样就改变了默认的事务处理方式。

启示 :

这就要求我们在自定义异常的时候,让自定义的异常继承自RuntimeException,这样抛出的时候才会被Spring默认的事务处理准确处理。

java 事务回滚失败相关推荐

  1. java 事务 回滚

    给java后台方法添加事务回滚注解,在方法进行多表的增删改查的时候,如果失败可以对此方法前面的一些更新数据库表的语句进行撤销(回滚) 注解:@Transactional(rollbackFor = E ...

  2. spring注解事务及事务回滚失败的原因

    背景 spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager.对于编程 ...

  3. java 事务回滚注解_Java Spring 事务回滚详解

    这篇文章主要介绍了java Spring事务回滚的相关资料,需要的朋友可以参考下 spring 事务回滚 1.遇到的问题 当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误.伪代 ...

  4. Java 事务回滚(执行某方法时)PlatformTransactionManager

    利用 PlatformTransactionManager 可做到手动控制事务回滚, 本示例是在Service层注入 @Resourceprivate PlatformTransactionManag ...

  5. JAVA事务回滚的使用方法

    假设这是一个service类的片段 try{      //出现异常 } catch (Exception e) {             e.printStackTrace();         ...

  6. Java事务回滚问题:抛出异常事务,并返回给前端异常信息

    1.背景 修改bug. 之前的开发写的只能单选,所以逻辑都是按照只需要传递一个id值的逻辑写的 现在改为多选时,传递过来的是id数组,所以直接原逻辑的外层加了一个循环,这样原逻辑包括sql就不需要大变 ...

  7. Spring事务回滚失败

    下面是一个回滚事务的案例 需求是:转账失败后 转账的事务会回滚,日志事务不会回滚 出现的问题是: 日志事务开启了@Transactional(propagation = Propagation.REQ ...

  8. spring mysql 事务回滚失败_Spring事务回滚失败

    我在Service层里面调用两个Dao层的方法.一个方法用于储存一行Investor数据,一个方法用于储存和有Investor主键的Address数据.service层方法如下,注意Investor继 ...

  9. spring事务回滚理解

    1.代码中事务控制的3种方式 编程式事务:就是直接在代码里手动开启事务,手动提交,手动回滚.优点就是可以灵活控制,缺点就是太麻烦了,太多重复的代码了. 声明式事务:就是使用SpringAop配置事务, ...

  10. 详解spring事务失效和回滚失败的场景

    详解spring事务失效和回滚失败的场景 详解spring事务失效和回滚失败的场景 前言 一 .事务不生效 1.访问权限问题 2. 方法用final修饰 3.方法的内部调用 3.1 新加一个Servi ...

最新文章

  1. Matlab(一) .jpg转.ppm
  2. [HDU5828]Rikka with Sequence
  3. linux设备模型bus,device,driver,(kobject、ktype、kset,bus_type、device、device_driver)
  4. 状态压缩DP AcWing算法提高课 (详解)
  5. C#字符串的基本操作
  6. AC-DC电源模块设计原理及10个常见疑问
  7. 关于gitgithub的操作
  8. 95-24-030-Future-ChannelFuture
  9. 玩转Koa之核心原理分析
  10. 效率低的日子怎么办?
  11. python判断变量相等_Python判断两个对象相等的原理
  12. java适配器模式_java设计模式之适配器模式
  13. 格签名困难假设: 最短向量问题SVP
  14. 车票预订系统 搭建服务器,火车票网上订票系统的设计与实现.doc
  15. Android全局设置APP为黑白模式的两种方案
  16. matlab plc控制系统设计,基于MATLAB的PLC温度监控系统设计
  17. Multisim实现极简数码管显示
  18. SCI英文论文写作- Latex 进阶
  19. winUSB设备的开发方法
  20. 按键控制输出占空比可调的PWM波

热门文章

  1. java 保存图片_java后台接受到图片后保存方法
  2. 上星远程控制实验(一)
  3. 办公室计算机设备搬迁计划方案,计算机机房整体搬迁方案稿 执行计划.doc
  4. 自学php到精通需要多久,PHP从入门到精通需要多长时间?
  5. goahead源码分析webs.c
  6. 高等数学学习笔记——第十二讲——正项级数收敛性判别方法
  7. CVPR 2021 UniT: Multimodal Multitask Learning with a Unifified Transformer
  8. 什么是前端总线,后端总线,内部总线、系统总线,外部总线,地址总线,数据总线,控制总线
  9. php 调用speex解码库,android 用speex做回音消除
  10. 水利知识库AI助手+公务员资料【产品经理】