在對Spring的事務回滾捕獲的異常類型進行測試,發現當出現SQL異常時可以觸發事務回滾,但是通過查看文檔發現,Java.lang.SQLExcepetion是Java.lang.Excepetion的子類,在沒有對事務設置rollbackfor=Exception.class時是不會默認對捕獲的Excepetion類型異常觸發事務回滾操作,而實際情況卻與此相反,觸發了事務回滾。
在項目開發中引入了spring框架後,SQLExcepetion被org.springframework重寫,經過重寫後涉及到dao的異常都是java.lang.RuntimeException的子類。因此事務回滾纔會發生。
我們知道 org.springframework.dao.DuplicateKeyException來自spring-tx-4.0.0.RELEASE.jar
反編譯可見:
java.lang.Object
|____java.lang.Throwable
|____ java.lang.Exception
|____ java.lang.RuntimeException
|____ org.springframework.core.NestedRuntimeException
|____org.springframework.dao.DataAccessException
|____ org.springframewor