在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 }