[英]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將默認回滾事務。
在其默認配置中,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.