spring 事務注解
默認遇到throw new RuntimeException("...");會回滾
需要捕獲的throw new Exception("...");不會回滾
// 指定回滾
@Transactional(rollbackFor=Exception.class)
public void methodName() {
// 不會回滾
throw new Exception("...");
}
//指定不回滾
@Transactional(noRollbackFor=Exception.class)
public ItimDaoImpl getItemDaoImpl() {
// 會回滾
throw new RuntimeException("注釋");
}
1、Error與Exception
Error是程序無法處理的錯誤,比如OutOfMemoryError、ThreadDeath等。這些異常發生時,Java虛擬機(JVM)一般會選擇線程終止。
Exception是程序本身可以處理的異常,這種異常分兩大類運行時異常和非運行時異常。
程序中應當盡可能去處理這些異常。
2、運行時異常和非運行時異常
運行時異常都是RuntimeException類及其子類異常,如NullPointerException、IndexOutOfBoundsException等,
這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發生。
非運行時異常是RuntimeException以外的異常,類型上都屬於Exception類及其子類。
從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。
如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。
我的測試
employeeEntity = employeeDao.saveOrUpdate(employeeEntityDB);
}else{
employeeEntity = employeeDao.saveOrUpdate(employeeEntity);
}
if(employeeEntity.getEmployeeName().length()>0){
throw new SQLException("sss");
}
return employeeEntity;
如果我主動拋出 throw new SQLException("sss");
結果沒有回滾,按照上面說的,SQLException不是runtimeException,所以不會回滾,實際證明也是如此
如果我主動拋出runtimeEception異常,結果證明確實回滾了
而對於 if(employeeEntity.getEmployeeName().length()>0){
throw new Exception("sss");
}
Exception是運行時異常和非運行時異常的父類,實際也是必須捕獲的,而測試發現,拋出此類異常不能產生事物回滾
剛剛我又在DAO部分拋出Exceotion異常,在service繼續拋出,結果仍然是沒有數據回滾,在此驗證了拋Exception異常是不回滾的!!!