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