今天用JTA管理事務時,發現事務不能正確的回滾,具體情況是RuntimeException類型的異常能被正確的回滾,但是其它非RuntimeException異常則不能正確回滾,也就是說非運行時異常沒有被spring框架捕獲。
查看spring文檔獲知,默認情況下,spring框架只捕獲RuntimeException異常或是其子類,要想捕獲非運行時異常則需要如下配置:
注意:
rollback-for="YourException" 是關鍵代碼!"YourException"代表哪一類型的異常能被正確的回滾。這里可以指定Exception或是Throwable。這樣配置就可以捕獲指定類型的異常了。
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true" rollback-for="YourException"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>