在spring的文檔中說道,spring聲明式事務管理默認對非檢查型異常和運行時異常進行事務回滾,而對檢查型異常則不進行回滾操作。
什么是檢查型異常和什么是非檢查型異常?
1:非檢查型異常
繼承自RuntimeException(也是Exception的子類)或error的是非檢查型異常
非檢查型類異常可以不用捕獲
2:檢查型異常
繼承自Exception的則是檢查型異常
而檢查型異常則必須用try語句塊進行處理或者把異常交給上級方法處理
spring的事務邊界是在調用業務方法之前開始的,業務方法執行完畢之后來執行commit or rollback(Spring默認取決於是否拋出runtime異常).
如果拋出runtime exception 並在你的業務方法中沒有catch到的話,事務會回滾
在實際業務中 如果我們把業務方法放到一個catch中,這個業務方法也就等於脫離了spring事務的管理,因為沒有任何異常會從業務方法中拋出!全被捕獲並吞掉,導致spring異常拋出觸發事務回滾策略失效。
這樣的話,我們需要在catch 里面 手動去回滾 加上 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 這段就OK了
try {
method1();
method2();
} catch(Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
