批量處理-單次異常-回滾單次內容
阿新 • • 發佈:2021-12-16
批量處理-單次異常-回滾單次內容
批量任務,其中一批次異常,僅回滾 本批次整條線,但 批量任務中的其他任務不影響。
解決方案:
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 @Autowired17 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: