spring在service層的方法報錯事務不會回滾的解決

spring在service層方法報錯事務不會回滾

@Transactional(rollbackFor = {Exception.class})
public void insertData() throws Exception {
    // 業務代碼1
    business1();
    
    // 業務代碼2
    business2();
    
    // 業務代碼3
    business3();
}
 
public void business1() {
    // 此處省略業務操作
}
 
public void business2() {
    // 此處省略業務操作
}
 
public void business3() {
    // 此處省略業務操作
}

以上代碼在service層執行insertData方法時,business3中的代碼執行出錯瞭,business1和business2中的操作都沒有回滾

解決方法

方法一:在service方法中捕獲異常,同時向外拋出運行時異常

@Transactional(rollbackFor = {Exception.class})
public void insertData() throws Exception {
    try {
        // 業務代碼1
        business1();
        
        // 業務代碼2
        business2();
        
        // 業務代碼3
        business3();
    } catch(Exception e) {
        throw new RuntimeException(e);
    }
}

方法二:在service方法中捕獲異常,同時手動回滾事務

service手動回滾問題

如果對spring配置瞭service層事物的管理。

在一些業務中需要回滾,正常來說拋出一個運行時異常即可

throw new RuntimeException();

隻是這樣的話代碼就結束瞭,如果要返回給用戶錯誤信息,不太方便,這時可以添加如下代碼,在catch中手動回滾

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

這樣既能正常返回錯誤信息,而又保持瞭事物的原子性。 

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: