Spring事务管理只对出现运行期异常进行回滚


在Spring框架中,事务管理默认是对运行时异常(RuntimeException及其子类)和错误(Error及其子类)进行回滚的。然而,对于检查型异常(checked exceptions,即除了RuntimeException和Error之外的异常),Spring事务管理器默认是不会进行回滚的。

如果你希望Spring事务管理对检查型异常也进行回滚,有几种方式可以实现:

1. **在方法签名上声明抛出RuntimeException**:将你的方法签名中的检查型异常包装成RuntimeException抛出。这通常不是最佳实践,因为它改变了异常的语义,但可以在不修改Spring配置的情况下快速实现。


   public void someMethod() throws MyCustomRuntimeException {
       try {
           // 可能抛出检查型异常的操作
       } catch (CheckedException e) {
           throw new MyCustomRuntimeException("检查型异常发生", e);
       }
   }
   

2. **使用`@Transactional`注解的`rollbackFor`属性**:你可以在`@Transactional`注解中指定需要回滚的异常类型。这允许你精确控制哪些异常应该触发事务回滚。


   @Transactional(rollbackFor = CheckedException.class)
   public void someMethod() throws CheckedException {
       // 可能会抛出CheckedException的操作
   }
   

注意,`rollbackFor`属性可以指定一个或多个异常类,如果方法执行过程中抛出了这些异常之一,则事务将被回滚。

3. **使用`@Transactional`注解的`rollbackForClassName`属性**:这个属性允许你通过异常类的完全限定名来指定需要回滚的异常,这在某些情况下可能更灵活。


   @Transactional(rollbackForClassName = "com.example.CheckedException")
   public void someMethod() throws CheckedException {
       // 可能会抛出CheckedException的操作
   }
   

使用这些方法,你可以根据实际需求配置Spring事务管理,使其对不同类型的异常进行回滚。