@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。

推薦閱讀: