Struts2+Spring中抛出一般异常(checked exception)事务不回滚的问题

在用String进程事务管理时,Spring只会在运行时异常(runtime exception)抛出时回滚数据库操作,如果我们自定义的异常或者其他没有继承runtime exception的异常抛出时,String不会回滚事务。如果你的抛出某种异常时,有两种方法。

一、为Spring添加需要回滚的异常

因为本人在使用tx:advice来配置Spring事务,所以只说明此方法。
ts:advice配置如下:


其中标签有几个属性:

属性

说明

name 方法名的匹配模式,通知根据该模式寻找匹配的方法。该属性可以使用asterisk (*)通配符
propagation 设定事务定义所用的传播级别
isolation 设定事务的隔离级别
timeout 指定事务的超时(单位为秒)
read-only 该属性为true指示事务是只读的(典型地,对于只执行查询的事务你会将该属性设为true,如果出现了更新、插入或是删除语句时只读事务就会失败)
no-rollback-for 以逗号分隔的异常类的列表,目标方法可以抛出这些异常而不会导致通知执行回滚
rollback-for 以逗号分隔的异常类的列表,当目标方法抛出这些异常时会导致通知执行回滚。默认情况下,该列表为空,因此不在no-rollback-for列表中的任何运行时异常都会导致回滚

 

看到,我们可以在rollback-for中配置我们要回滚的异常,如:

这样,就算你抛出的MyException,My2Exception异常不是运行时异常,Spring也会回滚事务。

 

二、自定义异常继承RuntimeException

在定义异常的时间继承RuntimeException即可。

引用:http://book.51cto.com/art/200909/149437.htm

发表评论