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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?