1. 程式人生 > >Java異常與事物回滾探究

Java異常與事物回滾探究

轉自 http://www.linuxidc.com/Linux/2014-03/98885.htm

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