轉載:java
java阿里巴巴規範提示:方法【edit】須要在Transactional註解指定rollbackFor或者在方法中顯示的rollback。數據庫
先來看看異常的分類架構
error是必定會回滾的框架
這裏Exception是異常,他又分爲運行時異常RuntimeException和非運行時異常線程
可查的異常(checked exceptions):Exception下除了RuntimeException外的異常代理
不可查的異常(unchecked exceptions):RuntimeException及其子類和錯誤(Error)日誌
若是不對運行時異常進行處理,那麼出現運行時異常以後,要麼是線程停止,要麼是主程序終止。
若是不想終止,則必須捕獲全部的運行時異常,決不讓這個處理線程退出。隊列裏面出現異常數據了,正常的處理應該是把異常數據捨棄,而後記錄日誌。不該該因爲異常數據而影響下面對正常數據的處理。code
非運行時異常是RuntimeException之外的異常,類型上都屬於Exception類及其子類。如IOException、SQLException等以及用戶自定義的Exception異常。對於這種異常,JAVA編譯器強制要求咱們必需對出現的這些異常進行catch並處理,不然程序就不能編譯經過。因此,面對這種異常無論咱們是否願意,只能本身去寫一大堆catch塊去處理可能的異常。對象
開始主題@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}。
注意: