1. 程式人生 > >spring事務控制的方法中丟擲異常不回滾

spring事務控制的方法中丟擲異常不回滾

最近做專案時,由於業務需要,在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(),這樣前一個方法中執行的邏輯就也會回滾了。