Spring事务为什么不会自动回滚?Spring事务怎样才会自动回滚?事务自动回滚条件及手动回滚
原文:https://blog.csdn.net/qq_32331073/article/details/76508147
更多Spring事务问题请访问链接:Spring事务回滚问题疑难详解
在此,首先我们要明确RuntimeException与Exception之间的关系与他们分别的含义:
①在Java中异常的基类为Throwable,他有两个子类Exception与Errors,同时RuntimeException就是Exception的子类;
②RuntimeException,即运行时异常,为非受检(UNCHECKED)异常;
③Exception的其他子类异常,为非运行时异常,为受检异常(CHECKED)异常;
1,Spring事务回滚机制是这样的:当所拦截的方法有指定异常抛出,事务才会自动进行回滚!
我们需要注意的地方有四点: 如果你在开发当中引入Spring进行事务管理,但是事务没能正常的自动回滚,可以对照下面四点,缺一不可!
①被拦截方法-—— 注解式:方法或者方法所在类被@Transactional注解;
拦截配置式:<tx:method />应该包含对该方法,名称格式的定义;
且方法需要在expression定义的范围内;
②异常—— 该方法的执行过程必须出现异常,这样事务管理器才能被触发,并对此做出处理;
③指定异常—— 默认配置下,事务只会对Error与RuntimeException及其子类这些UNChecked异常,做出回滚。
一般的Exception这些Checked异常不会发生回滚(如果一般Exception想回滚要做出配置);
如果你不知道哪些是RuntimeException或者你觉得在默认配置下发生一般的Exception,事务也能如愿回滚,请访
问链接:哪些异常是RuntimeException?Sql异常属于RuntimeException吗?Spring下SQL异常事务回滚?
举例:实现一般异常的回滚:
注解式:
- @Transactional(rollbackFor=Exception.class)
- @RequestMapping("consump")
- public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{
拦截配置式:
- @RequestMapping("consump")
- public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{
- <tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
④异常抛出—— 即方法中出现的指定异常,只有在被事务管理器捕捉到以后,事务才会据此进行事务回滚;
1,不捕捉,会回滚:
- public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{
- int a=consumpDao.insert(s);
- int b=customerDao.update(customer);
- }
2,如果异常被try{}捕捉到,那么事务管理器就无法再捕捉异常,所以就无法做出反应,事务不回滚;
- public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{
- try{
- int a=consumpDao.insert(s);
- int b=customerDao.update(customer);
- }catch(RuntimeException){
- }
- }
3,如果异常被try{}捕捉了,我们还可以在Catch(){}中throw new RuntimeException(),手动抛出运行时异常供事务管理器捕捉;
- public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{
- try{
- int a=consumpDao.insert(s);
- int b=customerDao.update(customer);
- }catch(){
- throw new RuntimeException();
- }
- }
2,在实际开发中,有时并没有异常发生,但是由于事务结果未满足具体业务需求,所以我们不得不手动回滚事务!
有如下两种方法:
①手动抛出异常(如果你没有配置一般异常事务回滚,请抛出运行时异常)
- int a=consumpDao.insert(s);
- int b=customerDao.insert(customer);
- int d=0;//制造未被满足的业务需求
- if(a*b*d==1){
- json.put("result",0);
- json.put("msg", "购买成功");
- json.put("data", "");
- }else{
- json.put("result",-1);
- json.put("msg", "购买失败");
- json.put("data", "");
- throw new RuntimeException();
- }
②编程式实现手动回滚
- int a=consumpDao.insert(s);
- int b=customerDao.insert(customer);
- int d=0;//制造未被满足的业务需求
- if(a*b*d==1){
- json.put("result",0);
- json.put("msg", "购买成功");
- json.put("data", "");
- }else{
- json.put("result",-1);
- json.put("msg", "购买失败");
- json.put("data", "");
- TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
- }
注意:尽管可以采用编程式方法回滚事务,但“回滚”只是事务的生命周期之一,所以要么编程实现事务的全部必要周期,要么仍要配置事务切点,即,将事务管理的其他周期交由Spring的标识!
Spring事务为什么不会自动回滚?Spring事务怎样才会自动回滚?事务自动回滚条件及手动回滚的更多相关文章
- spring 事务控制 设置手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//假设这是一个service类的片段 try{ //出现异常 } catch (Exception e) { e.printStackTrace(); //设置手动回滚 TransactionAsp ...
- Jenkins+Ansible+Gitlab自动发布/回滚Spring项目
一.实现方法流程图 流程图如下:代码托管在本地GitLab上(为了复现整套流水线,我直接使用了GitHub,懒得再搭建GitLab),开发完成后提交代码到代码仓库,[自动]触发Jenkins进行持续集 ...
- Spring:Spring事务手动回滚方式
方法1: 在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句 ...
- 事务隔离级别与传播机制,spring+mybatis+atomikos实现分布式事务管理
1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单 ...
- Spring是如何保证同一事务获取同一个Connection的?使用Spring的事务同步机制解决:数据库刚插入的记录却查询不到的问题(转)
前言 关于Spring的事务,它是Spring Framework中极其重要的一块.前面用了大量的篇幅从应用层面.原理层面进行了比较全方位的一个讲解.但是因为它过于重要,所以本文继续做补充内容:Spr ...
- 数据库事务中的隔离级别和锁+spring Transactional注解
数据库事务中的隔离级别和锁 数据库事务在后端开发中占非常重要的地位,如何确保数据读取的正确性.安全性也是我们需要研究的问题.ACID首先总结一下数据库事务正确执行的四个要素(ACID): 原子性(At ...
- Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别
转: http://blog.csdn.net/it_man/article/details/5074371 Spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之 ...
- [转]数据库事务中的隔离级别和锁+spring Transactional注解
数据库事务中的隔离级别和锁 数据库事务在后端开发中占非常重要的地位,如何确保数据读取的正确性.安全性也是我们需要研究的问题.ACID首先总结一下数据库事务正确执行的四个要素(ACID): 原子性(At ...
- 为什么要用Hibernate框架? 把SessionFactory,Session,Transcational封装成包含crud的工具类并且处理了事务,那不是用不着spring了?
既然用Hibernate框架访问管理持久层,那为何又提到用Spring来管理以及整合Hibernate呢?把SessionFactory,Session,Transcational封装成包含crud的 ...
随机推荐
- 2017百度春招<有趣的排序>
题目 度度熊有一个N个数的数组,他想将数组从小到大排好序,但是萌萌的度度熊只会下面这个操作:任取数组中的一个数然后将它放置在数组的最后一个位置.问最少操作多少次可以使得数组从小到大有序? #inclu ...
- Butter Knife:一个安卓视图注入框架
Butter Knife:一个安卓视图注入框架 2014年5月8日 星期四 14:52 官网: http://jakewharton.github.io/butterknife/ GitHub地址: ...
- linux下c图形化编程之gtk+2.0简单学习
在linux下想做一个图形化的界面,然后自己选择使用gtk+2.0来进行编辑,我的电脑已经安装过gtk+2.0了,所以就在网上找了一个安装方法,结果未测试,大家有安装问题可以说下,一起探讨下. 1.安 ...
- Windows内核读书笔记——Windows异常分发处理机制
本篇读书笔记主要参考自<深入解析Windows操作系统>和<软件调试>这两本书. IDT是处理异常,实现操作系统与CPU的交互的关口. 系统在初始化阶段会去填写这个结构. ID ...
- find tar排除指定文件或目录操作及查找文件内容关键字
1.find查找排除单个目录 查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk find . -path "./sk" -prune -o -name "*. ...
- Jmeter-----图形监控
1.下载插件地址:https://jmeter-plugins.org/downloads/old/ 1)JmeterPlugins-Standard 插件:将JMeterPlugins.jar放到J ...
- 尝试 TFS Express 2012.3
之前一直使用SVN做版本管理,但是只能管理代码.之前的一份工作,只用了TFS来管理,可以将任务与代码集成管理,很是方便,只是安装太过于繁琐,现在的公司人少,不想费那么多事. 最关键的,就是安装TFS需 ...
- chrome浏览器插件开发经验(一)
最近在进行chrome浏览器插件的开发,一些小的经验总结随笔. 1.首先,推荐360的chrome插件开发文档:http://open.chrome.360.cn/extension_dev/over ...
- css让元素不可点击 pointer-events: none;
张鑫旭大神:http://www.zhangxinxu.com/wordpress/2011/12/css3-pointer-events-none-javascript/ 我们知道form元素里的 ...
- eclipse 创建 maven 项目时如何修改 web 的版本和 jdk 的版本
eclipse 创建 maven 项目时如何修改 web 的版本和 jdk 的版本 在使用 eclipse 创建 maven 项目的时候,默认的 web.xml 的版本时 2.3,默认 jre 的版本 ...