阿里巴巴Java規範:方法【edit】須要在Transactional註解指定rollbackFor或者在方法中顯示的rollback。數據庫
先來看看異常的分類架構
error是必定會回滾的框架
這裏Exception是異常,他又分爲運行時異常RuntimeException和非運行時異常.net
若是不對運行時異常進行處理,那麼出現運行時異常以後,要麼是線程停止,要麼是主程序終止。 若是不想終止,則必須捕獲全部的運行時異常,決不讓這個處理線程退出。線程
隊列裏面出現異常數據了,正常的處理應該是把異常數據捨棄,而後記錄日誌。不該該因爲異常數據而影響下面對正常數據的處理。代理
非運行時異常是RuntimeException之外的異常,類型上都屬於Exception類及其子類。如IOException、SQLException等以及用戶自定義的Exception異常。擴展:Java項目構建基礎:統一結果,統一異常,統一日誌日誌
對於這種異常,JAVA編譯器強制要求咱們必須對出現的這些異常進行catch並處理,不然程序就不能編譯經過。因此,面對這種異常無論咱們是否願意,只能本身去寫一大堆catch塊去處理可能的異常。對象
開始主題,@Transactional若是隻這樣寫,blog
Spring框架的事務基礎架構代碼將默認地 只 在拋出運行時和unchecked exceptions時才標識事務回滾。繼承
也就是說,當拋出個RuntimeException 或其子類例的實例時。(Errors 也同樣 - 默認的 - 標識事務回滾。)從事務方法中拋出的Checked exceptions將 不 被標識進行事務回滾。
注意: 若是異常被try{}catch{}了,事務就不回滾了,若是想讓事務回滾必須再往外拋try{}catch{throw Exception}。
Spring團隊的建議是你在具體的類(或類的方法)上使用 @Transactional 註解,而不要使用在類所要實現的任何接口上。
你固然能夠在接口上使用 @Transactional 註解,可是這將只能當你設置了基於接口的代理時它才生效。
由於註解是不能繼承的,這就意味着若是你正在使用基於類的代理時,那麼事務的設置將不能被基於類的代理所識別,並且對象也將不會被事務代理所包裝(將被確認爲嚴重的)。所以,請接受Spring團隊的建議而且在具體的類上使用 @Transactional 註解。
@Transactional 註解標識的方法,處理過程儘可能的簡單。尤爲是帶鎖的事務方法,能不放在事務裏面的最好不要放在事務裏面。能夠將常規的數據庫查詢操做放在事務前面進行,而事務內進行增、刪、改、加鎖查詢等操做。
注:rollbackFor 能夠指定可以觸發事務回滾的異常類型。Spring默認拋出了未檢查unchecked異常(繼承自 RuntimeException 的異常)或者 Error纔回滾事務;其餘異常不會觸發回滾事務。
若是在事務中拋出其餘類型的異常,但卻指望 Spring 可以回滾事務,就須要指定 rollbackFor屬性。
做者:Mint6
blog.csdn.net/Mint6/article/details/78363761