spring事務控制的方法中丟擲異常不回滾
阿新 • • 發佈:2019-01-05
最近做專案時,由於業務需要,在service中丟擲自定義異常時出現了事務不回滾的情況,具體情況如下:
public void editEpidemic(Epidemic epidemic) throws EpidemicException{
EpidemicLog log = new EpidemicLog();
log.setType(ConstantsUtils.EPIDEMIC);
log.setOperateDate(new Date());
saveLog(log);
saveEpidemic(epidemic);
}
public void saveEpidemic(Epidemic epidemic)throws EpidemicException{
if(1 != 0){
throw new EpidemicException("ERROR TYPE!");
}
epidemicActionService.save(action);
}
public void saveLog(EpidemicLog log){
logService.save(log);
}
editEpidemic方法執行到saveEpidemic時會丟擲自定義的異常:EpidemicException,就會出現saveLog中儲存的log不會回滾
查了下spring的事務機制,發現spring預設的事務只在發生未被捕獲的RuntimeException時才會回滾,而我自定義的EpidemicException是直接繼承Exception的,把這個改為繼承自RuntimeException就好了。
另外,在service中有try、catch程式碼塊,切其中有多個方法時,當後一個方法丟擲異常時前一個方法中執行的也是不會回滾的,這裡需要在catch中處理完邏輯後面手動丟擲一個throw new RuntimeException(),這樣前一個方法中執行的邏輯就也會回滾了。