哪些異常是RuntimeException?Sql異常屬於RuntimeException嗎?Spring下SQL異常事務回滾
一,為什麽框架中根本沒有對Exception的一般子類進行回滾配置,異常發生時,事務都進行了回滾 ,說好的只會對RuntimeException(Unchecked 非受檢異常)回滾呢?
此時,我們就有必要了解一下,RuntimeException所包含的子類具體有哪些:
這時,或許你就明白了 : 平常代碼運行階段經常遇到的那些異常,其實都是RuntimeException的子類。
受檢異常(Checked)一般在編譯期就被檢出,這就給你造成了一個Spring對於所有異常都會發生回滾的誤解。
下面給出一些受檢CHECKED異常:
org.springframework.dao.DuplicateKeyException 應該是RuntimeException的子類
三,作出結論,是SQL異常屬於RuntimeException的子類?還是默認配置一般異常也會回滾呢?
① 查看接口文檔java.lang.SqlException,
java.lang.Object
|____java.lang.Throwable
|____ java.lang.Exception
|____ java.lang.SQLException
可以看出java.lang.SqlException,確實是Exception的直接子類,屬於CHECKED受檢異常,事務是不會因為它發生回滾的!
② 實際上,當我們在項目開發中加入了Spring框架以後,SQL異常都被org.springframework重寫,正如上面的重復主鍵的SQL異 常。
產生原因:很顯然該異常原因屬於一般異常,而被Spring捕捉後拋出其他自定義的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.springframework.dao.NonTransientDataAccessException
|____org.springframework.dao.DataIntegrityViolationException
|____org.springframework.dao.DuplicateKeyException
同樣方法可以查得:org.springframework.dao中的異常都是RuntimeException的子類
得出結論:Spring框架下,所有SQL異常都被org.springframework重寫為RuntimeException,事務因此也會發生回滾!
原文鏈接: https://blog.csdn.net/qq_32331073/article/details/76525372
哪些異常是RuntimeException?Sql異常屬於RuntimeException嗎?Spring下SQL異常事務回滾