簡體   English   中英

Spring事務:在Exception或Throwable上回滾

[英]Spring transaction: rollback on Exception or Throwable

我想知道用它代替是否有意義

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)

使用Throwable

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)

據我所知,捕捉Error將幫助我們正確行事,即使發生了非常糟糕的事情。 或者也許沒有用?

據我所知,捕捉錯誤將幫助我們正確行事,即使發生了非常糟糕的事情。 或者也許沒有用?

您不需要顯式指定rollbackFor = Throwable.class ,因為如果發生Error ,spring將默認回滾事務。

請參見12.5.3回滾聲明性事務

在其默認配置中,Spring Framework的事務基礎結構代碼僅在運行時未經檢查的異常情況下標記用於回滾的事務; 也就是說,拋出的異常是RuntimeException的實例或子類。 (錯誤也將 - 默認情況下 - 導致回滾) 從事務方法拋出的已檢查異常不會導致在默認配置中回滾。

或者看一下DefaultTransactionAttribute

public boolean rollbackOn(Throwable ex) {
    return (ex instanceof RuntimeException || ex instanceof Error);
}

由於您使用的是@Transactional ,我們可以放心地假設您正在通過Spring,Hibernate或其他JDBC包裝器執行數據庫操作。 這些JDBC包裝器通常不會拋出已檢查的異常,它們會拋出包含JDBC SQLException類型的運行時異常。

默認情況下,@ @Transactional設置為回滾,只有在拋出未經檢查的異常時才會回滾。

考慮一個像這樣的用例

@Transactional
public void persistAndWrite(Bean someBean) throws IOException {
    // DB operation
    getSession().save(someBean); 

    // File IO operation which throws IOException
    someFileService.writeToFile(someBean); 
}

您不一定要回滾數據庫操作只是因為我們無法將某些內容寫入文件。

同樣

@Transactional
public void persistAndThrowOutOfMemory(Bean someBean)  {
    // DB operation
    getSession().save(someBean);

    // consumes all memory, throws OutOfMemoryError
    someService.hugeOperationThrowsOutOfMemoryError(); 
}

您不一定要回滾已保存的實體,因為某些服務會導致消耗太多內存。

@Transactional為您提供選項。 在適當的地方使用它。

我不知道是否可能但是處理像Error s這樣的Throwable是一種糟糕的編程風格,開發人員不負責處理這種致命的錯誤。 總是會發生你無法處理的壞事。 您應該在必要時處理已檢查的異常,這些異常是您的系統已知的某種類型的邏輯錯誤。

rollback的默認值是在Error Exception上注冊但是當你注冊try{}catch{}它會覆蓋錯誤,所以在這種情況下使用

catch {
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
      }

手動完成或刪除try catch

您也可以在事務注釋中注冊異常類型,例如:

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM