1. 程式人生 > >哪些異常是RuntimeException?Sql異常屬於RuntimeException嗎?Spring下SQL異常事務回滾

哪些異常是RuntimeException?Sql異常屬於RuntimeException嗎?Spring下SQL異常事務回滾

tail 好的 duplicate 代碼 blog 後拋 ase owa 接口文檔

一,為什麽框架中根本沒有對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異常事務回滾