今天用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>