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     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM