1. 程式人生 > 其它 >@Transactional中指定rollbackFor,弊端以及不能回滾的時候

@Transactional中指定rollbackFor,弊端以及不能回滾的時候

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

 

# 異常的分類

 

先來看看異常的分類

 

error是一定會回滾的。

 

這裡Exception是異常,他又分為執行時異常RuntimeException和非執行時異常  

 

 

  • 可查的異常(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將不被標識進行事務回滾。

 

1 讓checked例外也回滾:

在整個方法前加上 @Transactional(rollbackFor=Exception.class)

 

2 讓unchecked例外不回滾:

@Transactional(notRollbackFor=RunTimeException.class)

 

3 不需要事務管理的(只查詢的)方法:

@Transactional(propagation=Propagation.NOT_SUPPORTED)

 

注意:如果異常被try{}catch{}了,事務就不回滾了,如果想讓事務回滾必須再往外拋try{}catch{throw Exception}。

 

# 注意:

 

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

 

你當然可以在介面上使用 @Transactional 註解,但是這將只能當你設定了基於介面的代理時它才生效。因為註解是不能繼承的,這就意味著如果你正在使用基於類的代理時,那麼事務的設定將不能被基於類的代理所識別,而且物件也將不會被事務代理所包裝(將被確認為嚴重的)。因此,請接受Spring團隊的建議並且在具體的類上使用 @Transactional 註解。

 

@Transactional 註解標識的方法,處理過程儘量的簡單。尤其是帶鎖的事務方法,能不放在事務裡面的最好不要放在事務裡面。可以將常規的資料庫查詢操作放在事務前面進行,而事務內進行增、刪、改、加鎖查詢等操作。

來源:https://liupei.blog.csdn.net/article/details/107876505