1. 程式人生 > 其它 >批量處理-單次異常-回滾單次內容

批量處理-單次異常-回滾單次內容

批量處理-單次異常-回滾單次內容

批量任務,其中一批次異常,僅回滾 本批次整條線,但 批量任務中的其他任務不影響。

解決方案:

1. 任務處理,單獨放入 一個類中,在 入口方法上(類上不可加) 加上事務:@Transactional(rollbackFor = Exception.class)

2. 將 批量任務 的 for 迴圈 中的任務處理 用 try catch 包裹。

示例程式碼:

批量處理頭部:

 1 import com.doctor.assistant.sharding.service.SimpleSave;
 2 import lombok.extern.log4j.Log4j2;
3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.stereotype.Service; 5 6 /** 7 * @ClassName BussDomain 8 * @Description 批量處理,單次回滾測試 9 * @Author wqb 10 * @Version 1.0 11 **/ 12 @Log4j2 13 @Service 14 public class BussDomain { 15 16 @Autowired
17 SimpleSave simpleSave; 18 19 public void multiInsert(){ 20 for (int i = 100; i < 106; i++) { 21 try { 22 simpleSave.saveGradeDO(i); 23 }catch (Exception e){ 24 System.out.println("發生異常!"); 25 } 26 } 27 }
28 29 }

批量處理,單個任務處理:

 1 import com.doctor.assistant.sharding.mapper.buss.*;
 2 import com.doctor.assistant.sharding.pojo.model.buss.*;
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.stereotype.Service;
 5 import org.springframework.transaction.annotation.Transactional;
 6 
 7 @Service
 8 public class SimpleSave{
 9 
10     @Autowired
11     TClassDOMapper tClassDOMapper;
12     @Autowired
13     TCourseDOMapper tCourseDOMapper;
14     @Autowired
15     TGradeDOMapper tGradeDOMapper;
16     @Autowired
17     TScoreDOMapper tScoreDOMapper;
18     @Autowired
19     TStudentDOMapper tStudentDOMapper;
20     // 1
21     @Transactional(rollbackFor = Exception.class)
22     public void saveGradeDO(int num){
23         System.out.println();
24         System.out.println("saveGradeDO 當前num="+num);
25         TGradeDO tGradeDO = new TGradeDO();
26         tGradeDO.setId(10+num);
27         tGradeDO.setGDesc("年級10-desc");
28         tGradeDO.setGradeName("年級10");
29         tGradeDOMapper.insert(tGradeDO);
30         this.saveClassDO(num, tGradeDO.getId());
31     }
32 
33     // 2
34     public TClassDO saveClassDO(int num, int gradeId){
35         System.out.println("saveClassDO 當前num="+num);
36         TClassDO tClassDO = new TClassDO();
37         tClassDO.setGradeId(gradeId);
38         tClassDO.setClassName("班級"+(10+num));
39         tClassDO.setDescription("班級"+(10+num)+"-desc");
40         tClassDOMapper.insert(tClassDO);
41         this.saveStudentDO(num, tClassDO.getId());
42         return tClassDO;
43     }
44 
45     public TStudentDO saveStudentDO(int num, int classId){
46         System.out.println("saveStudentDO 當前num="+num);
47         TStudentDO tStudentDO = new TStudentDO();
48         tStudentDO.setId(10+num);
49         tStudentDO.setClassId(classId);
50         tStudentDO.setStudentName("學生"+(10+num));
51         tStudentDO.setDescription("學生"+(10+num)+"-desc");
52         tStudentDOMapper.insert(tStudentDO);
53         this.saveCourseDO(num, tStudentDO.getId());
54         return tStudentDO;
55     }
56 
57     public TCourseDO saveCourseDO(int num, int studentId){
58         System.out.println("saveCourseDO 當前num="+num);
59         TCourseDO tCourseDO = new TCourseDO();
60         tCourseDO.setId(10+num);
61         tCourseDO.setCourseName("課程"+(10+num));
62         tCourseDOMapper.insert(tCourseDO);
63         if(num==103) throw new RuntimeException("異常");
64         this.saveScoreDO(num, studentId, tCourseDO.getId());
65         return tCourseDO;
66     }
67 
68     public TScoreDO saveScoreDO(int num, int studentId, int courseId){
69         System.out.println("saveScoreDO 當前num="+num);
70         TScoreDO tScoreDO = new TScoreDO();
71         tScoreDO.setId(10+num);
72         tScoreDO.setCourseId(courseId);
73         tScoreDO.setStudentId(studentId);
74         tScoreDO.setScore(new Double(80+num));
75         tScoreDOMapper.insert(tScoreDO);
76         return tScoreDO;
77     }
78 }

結果展示:id = 113 的整一批,全插入失敗。(t_grade.id = 113、t_class.grade_id = 113、t_student.id = 113 先是成功了,後因 t_corse 報錯 回滾了)

t_grade:

t_class:

t_student:

t_course:

t_score: