@Transactional註解:多個事務嵌套時,獨立事務處理方式
@Transactional註解:多事務嵌套,獨立事務處理
看下需求
在多個事務嵌套使用時,排除事務之間的回滾影響
解決方案
在不同服務類的方法中使用Transactional的propagation屬性來實現隔離事務。(註意兩個方法不在同一個服務類中)
Propagation.REQUIRES_NEW即說明該事務開啟單獨事務,不受其他事務影響
// 服務類A @Autowired private ABizService aBizService; @Override @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public String insert(FacedbInfoDTO facedbInfoDTO) throws ServiceException { ... aBizService.generateId(); } // 服務類B @Override @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) public String generateId() { ... }
嵌套事務分析@Transactional
事務類型總共有七種;在這就介紹常用的的兩個。
@Transactional(propagation=Propagation.REQUIRED)//如果有事務,那麼加入事務,沒有的話新創建一個;不指定propagation默認就是這個 @Transactional(propagation=Propagation.REQUIREDS_NEW)//不管是否存在事務,都創建一個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務,
Propagation.REQUIRED類型事務嵌套
A事務方法調用B事務方法時如果兩個事務註解在生效的情況下,在這裡A事務稱為父類,B事務稱為子類;A方法操作數據庫後調用B方法,下列異常拋出時保證AB方法裡對數據庫操作都完成瞭才拋出異常;RuleException繼承的RuntimeException;
列舉一下測試結果:
總結:
1.如果子類方法拋出的異常,不管滿足子類還是父類的註解的回滾事務就會回滾;
2.如果父類拋出異常,隻看父類的事務註解,如果回滾就父子皆回滾,如果不回滾父子皆不回滾
嵌套事務類型是Propagation.REQUIRES_NEW
這種情況下子事務開啟瞭新的session,父事務先鎖定一條記錄(for update)子事務也鎖這一條記錄時就會死鎖;這點要註意;
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Spring中的@Transactional的工作原理
- springBoot service層事務控制的操作
- 使用@Transactional 設置嵌套事務不回滾
- 詳細談談Spring事務是如何管理的
- Spring詳細講解事務失效的場景