歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java異常與事物回滾探究

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異常是不回滾的!!!

Copyright © Linux教程網 All Rights Reserved