一、结论
spring的事务管理默认只对出现运行期异常(java.lang.runtimeexception及其子类)进行回滚。
如果一个方法抛出exception或者checked异常,spring事务管理默认不进行回滚。
关于异常的分类请参看本博客的《java异常分类》http://blog.csdn.net/woshixuye/article/details/8230407
二、改变默认方式
在@transaction注解中定义norollbackfor和rollbackfor指定某种异常是否回滚。
@transaction(norollbackfor=runtimeexception.class)
@transaction(rollbackfor=exception.class)
这样就改变了默认的事务处理方式。
三、启示
这就要求我们在自定义异常的时候,让自定义的异常继承自runtimeexception,这样抛出的时候才会被spring默认的事务处理准确处理。