Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 374|回复: 0

spring Transactional 抛异常事务不会回滚

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-27 17:13:30 | 显示全部楼层 |阅读模式

    在service层操作多张表时,加上@Transactional,尝试用 try catch来捕获异常,原本以为这样写会实现同一事务中某一个发生异常时,其他操作都会得到回滚

     1  @Transactional(rollbackFor=Exception.class)
     2     @Override
     3     public JSONObject delFywsjManages(HttpServletRequest request, HttpServletResponse response){
     4         JSONObject json = new JSONObject();
     5         String params = request.getParameter("params");
     6         String ywid = JSONUtil.getJSONString(params, "ywid");//业务id
     7         String quiz = JSONUtil.getJSONString(params, "quiz");//业务类型
     8         if(StringUtils.isBlank(ywid) || StringUtils.isBlank(quiz)){
     9             json.put("code",1);
    10             json.put("message","参数不能为空");
    11             return json;
    12         }
    13         try {
    14             int result = 0;
    15             switch (quiz.trim()){
    16                 case "sl"://申领
    17                     String applyId = fywsjManagesMapper.getApplyBakByApplyId(ywid);
    18                     if(StringUtils.isBlank(applyId)){
    19                         result = fywsjManagesMapper.insertApplyBak(ywid);
    20                         if(result != 0){
    21                             //1.apply_info 主表 id
    22                             fywsjManagesMapper.deleteApplyInfo(ywid);
    23                             //2.apply_acceptance 受理表 applyId
    24                             fywsjManagesMapper.deleteApplyAcceptance(ywid);
    25                             //3.apply_check 审查意见 applyId
    28                             fywsjManagesMapper.deleteApplyCheck(ywid);
    29                             //4.apply_decide 决定 applyId
    30                             fywsjManagesMapper.deleteApplyDecide(ywid);
    31                             //5.apply_transaction 办结 applyId
    32                             fywsjManagesMapper.deleteApplyTransaction(ywid);
    33                             throw new RuntimeException();
    34                         }
    35                     }else{
    36                         json.put("code",1);
    37                         json.put("message","当前申领信息在备份表中已存在,备份失败");
    38                         return json;
    39                     }
    40                     break;
    41                 case "hl"://换领
    42 
    43                     break;
    44                 case "bl"://补领
    45 
    46                     break;
    47                 case "zj"://增驾
    48 
    49                     break;
    50                 case "zc"://转出
    51 
    52                     break;
    53                 case "zr"://转入
    54 
    55                     break;
    56                 case "hf"://恢复
    57 
    58                     break;
    59             }
    60         }catch (Exception e){
    61             json.put("code",1);
    62             json.put("message","删除失败");
    63             throw new RuntimeException();
    64         }finally {
    65             return json;
    66         }
    67     }

     最初写了 int i=1/0;抛出了算数异常,发现被没有回滚;百度说在@Transactional注解中如果不配置rollbackFor属性,那么事物只会在遇到RuntimeException的时候才会回滚,所以改抛出throw new RuntimeException();结果依然出现不会滚的现象,接着有百度@Transactional(rollbackFor=Exception.class),如果类加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚。最终尝试发现依然没有解决问题.坚持百度最终发现 由于异常被catch, 不阻断整个事务执行。整个事务执行完后,执行commit 提交;一个事务能完成就一个事务
    事务嵌套传播的时候,少用try catch, 该回滚就回滚,最终修改版本如下,回滚的问题也被解决了

     1 @Transactional(rollbackFor=Exception.class)
     2     @Override
     3     public JSONObject delFywsjManages(HttpServletRequest request, HttpServletResponse response){
     4         JSONObject json = new JSONObject();
     5         String params = request.getParameter("params");
     6         String ywid = JSONUtil.getJSONString(params, "ywid");//业务id
     7         String quiz = JSONUtil.getJSONString(params, "quiz");//业务类型
     8         if(StringUtils.isBlank(ywid) || StringUtils.isBlank(quiz)){
     9             json.put("code",1);
    10             json.put("message","参数不能为空");
    11             return json;
    12         }
    13             int result = 0;
    14             switch (quiz.trim()){
    15                 case "sl"://申领
    16                     String applyId = fywsjManagesMapper.getApplyBakByApplyId(ywid);
    17                     if(StringUtils.isBlank(applyId)){
    18                         result = fywsjManagesMapper.insertApplyBak(ywid);
    19                         if(result != 0){
    20                             //1.apply_info 主表 id
    21                             fywsjManagesMapper.deleteApplyInfo(ywid);
    22                             //2.apply_acceptance 受理表 applyId
    23                             fywsjManagesMapper.deleteApplyAcceptance(ywid);
    24                             //3.apply_check 审查意见 applyId
    25                             /*int[] i=new int[1];
    26                             i[1]=0;*/
    27                             fywsjManagesMapper.deleteApplyCheck(ywid);
    28                             //4.apply_decide 决定 applyId
    29                             fywsjManagesMapper.deleteApplyDecide(ywid);
    30                             //5.apply_transaction 办结 applyId
    31                             fywsjManagesMapper.deleteApplyTransaction(ywid);
    32                             throw new RuntimeException();
    33                         }
    34                     }else{
    35                         json.put("code",1);
    36                         json.put("message","当前申领信息在备份表中已存在,备份失败");
    37                         return json;
    38                     }
    39                     break;
    40                 case "hl"://换领
    41 
    42                     break;
    43                 case "bl"://补领
    44 
    45                     break;
    46                 case "zj"://增驾
    47 
    48                     break;
    49                 case "zc"://转出
    50 
    51                     break;
    52                 case "zr"://转入
    53 
    54                     break;
    55                 case "hf"://恢复
    56 
    57                     break;
    58             }
    59             json.put("code",1);
    60             json.put("message","删除失败");
    61             return json;
    62     }

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-4 15:03 , Processed in 0.055587 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表