原文: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异常事务回滚?

举例:实现一般异常的回滚:

注解式:

  1. @Transactional(rollbackFor=Exception.class)
  2. @RequestMapping("consump")
  3. public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{

拦截配置式:

  1. @RequestMapping("consump")
  2. public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{
  1. <tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Exception" />

④异常抛出—— 即方法中出现的指定异常,只有在被事务管理器捕捉到以后,事务才会据此进行事务回滚;

1,不捕捉,会回滚:

  1. public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{
  2. int a=consumpDao.insert(s);
  3. int b=customerDao.update(customer);
  4. }

2,如果异常被try{}捕捉到,那么事务管理器就无法再捕捉异常,所以就无法做出反应,事务不回滚;

  1. public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{
  2. try{
  3. int a=consumpDao.insert(s);
  4. int b=customerDao.update(customer);
  5. }catch(RuntimeException){
  6. }
  7. }

3,如果异常被try{}捕捉了,我们还可以在Catch(){}中throw   new  RuntimeException(),手动抛出运行时异常供事务管理器捕捉;

  1. public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{
  2. try{
  3. int a=consumpDao.insert(s);
  4. int b=customerDao.update(customer);
  5. }catch(){
  6. throw new RuntimeException();
  7. }
  8. }

2,在实际开发中,有时并没有异常发生,但是由于事务结果未满足具体业务需求,所以我们不得不手动回滚事务!

有如下两种方法:

①手动抛出异常(如果你没有配置一般异常事务回滚,请抛出运行时异常)

  1. int a=consumpDao.insert(s);
  2. int b=customerDao.insert(customer);
  3. int d=0;//制造未被满足的业务需求
  4. if(a*b*d==1){
  5. json.put("result",0);
  6. json.put("msg", "购买成功");
  7. json.put("data", "");
  8. }else{
  9. json.put("result",-1);
  10. json.put("msg", "购买失败");
  11. json.put("data", "");
  12. throw new RuntimeException();
  13. }

②编程式实现手动回滚

  1. int a=consumpDao.insert(s);
  2. int b=customerDao.insert(customer);
  3. int d=0;//制造未被满足的业务需求
  4. if(a*b*d==1){
  5. json.put("result",0);
  6. json.put("msg", "购买成功");
  7. json.put("data", "");
  8. }else{
  9. json.put("result",-1);
  10. json.put("msg", "购买失败");
  11. json.put("data", "");
  12. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  13. }

注意:尽管可以采用编程式方法回滚事务,但“回滚”只是事务的生命周期之一,所以要么编程实现事务的全部必要周期,要么仍要配置事务切点,即,将事务管理的其他周期交由Spring的标识!

Spring事务为什么不会自动回滚?Spring事务怎样才会自动回滚?事务自动回滚条件及手动回滚的更多相关文章

  1. spring 事务控制 设置手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

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

  2. Jenkins+Ansible+Gitlab自动发布/回滚Spring项目

    一.实现方法流程图 流程图如下:代码托管在本地GitLab上(为了复现整套流水线,我直接使用了GitHub,懒得再搭建GitLab),开发完成后提交代码到代码仓库,[自动]触发Jenkins进行持续集 ...

  3. Spring:Spring事务手动回滚方式

    方法1: 在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句 ...

  4. 事务隔离级别与传播机制,spring+mybatis+atomikos实现分布式事务管理

    1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单 ...

  5. Spring是如何保证同一事务获取同一个Connection的?使用Spring的事务同步机制解决:数据库刚插入的记录却查询不到的问题(转)

    前言 关于Spring的事务,它是Spring Framework中极其重要的一块.前面用了大量的篇幅从应用层面.原理层面进行了比较全方位的一个讲解.但是因为它过于重要,所以本文继续做补充内容:Spr ...

  6. 数据库事务中的隔离级别和锁+spring Transactional注解

    数据库事务中的隔离级别和锁 数据库事务在后端开发中占非常重要的地位,如何确保数据读取的正确性.安全性也是我们需要研究的问题.ACID首先总结一下数据库事务正确执行的四个要素(ACID): 原子性(At ...

  7. Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别

    转: http://blog.csdn.net/it_man/article/details/5074371 Spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之 ...

  8. [转]数据库事务中的隔离级别和锁+spring Transactional注解

    数据库事务中的隔离级别和锁 数据库事务在后端开发中占非常重要的地位,如何确保数据读取的正确性.安全性也是我们需要研究的问题.ACID首先总结一下数据库事务正确执行的四个要素(ACID): 原子性(At ...

  9. 为什么要用Hibernate框架? 把SessionFactory,Session,Transcational封装成包含crud的工具类并且处理了事务,那不是用不着spring了?

    既然用Hibernate框架访问管理持久层,那为何又提到用Spring来管理以及整合Hibernate呢?把SessionFactory,Session,Transcational封装成包含crud的 ...

随机推荐

  1. navigator.geolocation详解

    https://blog.csdn.net/qq_27626333/article/details/51815467 PositionOptions: JSON对象,监听设备位置信息参数 naviga ...

  2. CGI、FastCGI和php-fpm的概念和区别

    CGI是HTTP Server和一个独立的进程之间的协议,把HTTP Request的Header设置成进程的环境变量,HTTP Request的正文设置成进程的标准输入,而进程的标准输出就是HTTP ...

  3. mysql军规

    总是在灾难发生后,才想起容灾的重要性.总是在吃过亏后,才记得曾经有人提醒过. 一,核心军规 不在数据库做计算,cpu计算务必移至业务层 控制单表数据量,单表记录控制在千万级 控制列数量,字段数控制在2 ...

  4. Cosbench测试 RGW S3 path_style_access=true模式支持

    使用Ceph RGW Cosbench  测试时,文档中没有写如何使用 path_style_access 模式的方法. 查看了一下cosbench源码发现已经支持,只是文档没有写. 提交了一个iss ...

  5. scala学习5--函数二

    to  def test() : Unit = { // for(i <- 1.to(100)){ // println(i) // } for(i <- 1 to 100 ){ prin ...

  6. OpenCV3学习笔记

    http://blog.csdn.net/u010429424/article/details/73691001 http://blog.csdn.net/zhaoxfxy/article/detai ...

  7. ***PHP5.6.x SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 解决方案

    centos: 在php.ini中增加一行 1 openssl.cafile=/etc/pki/tls/certs/ca-bundle.crt 重启服务器使修改生效

  8. ORA-12537: TNS:connection closed错误处理过程

    https://blog.csdn.net/mchdba/article/details/50018571

  9. day4 正则表达式(regular)

    正则(regular),要使用正则表达式需要导入Python中的re(regular正则的缩写)模块.正则表达式是对字符串的处理,我们知道,字符串中有时候包含很多我们想要提取的信息,掌握这些处理字符串 ...

  10. PHP实现插入排序

    插入排序思想: 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法. 它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描, 找到相应位置并插入.插入排序 ...