最近業務碰到for循環事務,每一個for循環中的代碼要單獨回滾單獨提交,不能影響外部代碼環境,研究過以後,記錄開發過程java
@Transactional(rollbackFor = Exception.class) public void aaa(List<String> toDoIds){ for (String toDoId : toDoIds) { try { //內層新建事務,for循環內單個事務單個提交或者回滾<2> sissCommonService.aaa(toDoId); }catch (Exception e){ e.printStackTrace(); } } }
次代碼中原來aaa()這個方法是用this調用的,也就是事務方法嵌套,嵌套了以後,被嵌套的方法是不會有事務的,因而,我新建了一個公共Service用來解決事務嵌套的問題,在單獨提出來的方法上加上了事務,而且制定了事務的傳播機制爲Propagation.REQUIRES_NEW,具體代碼this
@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW) public void updateOrderInfoPersonOutOrgan(String toDoId) throws Exception{ }
Propagation.REQUIRES_NEW的意思是,若是調用者當前有事務,就將事務掛起,從新開啓事務。這樣調用這個方法後,這個方法單獨開啓事務,每次執行完,單獨提交,遇到異常單獨回滾,外部方法收到拋出的異常並不處理就好,這樣內外事務互不影響。code