spring Transactional 抛异常事务不会回滚

在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     }
复制代码

 

posted @   java小白百百  阅读(3889)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示