天天看點

為什麼阿裡規範中要求事務注解@Transactional中指定rollbackFor?

阿裡巴巴Java規範:方法【edit】需要在Transactional注解指定rollbackFor或者在方法中顯示的rollback。

異常的分類

先來看看異常的分類

為什麼阿裡規範中要求事務注解@Transactional中指定rollbackFor?

error是一定會復原的

這裡Exception是異常,他又分為運作時異常RuntimeException和非運作時異常

為什麼阿裡規範中要求事務注解@Transactional中指定rollbackFor?
  • 可查的異常(checked exceptions):Exception下除了RuntimeException外的異常
  • 不可查的異常(unchecked exceptions):RuntimeException及其子類和錯誤(Error)

如果不對運作時異常進行處理,那麼出現運作時異常之後,要麼是線程中止,要麼是主程式終止。  如果不想終止,則必須捕獲所有的運作時異常,決不讓這個處理線程退出。

隊列裡面出現異常資料了,正常的處理應該是把異常資料舍棄,然後記錄日志。不應該由于異常資料而影響下面對正常資料的處理。

非運作時異常是RuntimeException以外的異常,類型上都屬于Exception類及其子類。如IOException、SQLException等以及使用者自定義的Exception異常。

對于這種異常,JAVA編譯器強制要求我們必須對出現的這些異常進行catch并處理,否則程式就不能編譯通過。是以,面對這種異常不管我們是否願意,隻能自己去寫一大堆catch塊去處理可能的異常。

@Transactional 的寫法

開始主題,@Transactional如果隻這樣寫,

Spring架構的事務基礎架構代碼将預設地 隻 在抛出運作時和unchecked exceptions時才辨別事務復原。

也就是說,當抛出個RuntimeException 或其子類例的執行個體時。(Errors 也一樣 - 預設地 - 辨別事務復原。)從事務方法中抛出的Checked exceptions将 不 被辨別進行事務復原。
  • 讓checked例外也復原:在整個方法前加上 @Transactional(rollbackFor=Exception.class)
  • 讓unchecked例外不復原:@Transactional(notRollbackFor=RunTimeException.class)
  • 不需要事務管理的(隻查詢的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
注意:如果異常被try{}catch{}了,事務就不復原了,如果想讓事務復原必須再往外抛try{}catch{throw Exception}。

注意

Spring團隊的建議是你在具體的類(或類的方法)上使用 @Transactional 注解,而不要使用在類所要實作的任何接口上。