spring事务默认只对runtimeexception和error自动回滚,对exception及其子类(如自定义受检异常)需显式配置rollbackfor属性,例如@transactional(rollbackfor = bizexception.class),且异常必须未被捕获、经代理调用才生效。

在 Spring 的 @Transactional 注解中,rollbackFor 用于明确指定哪些异常(包括非受检异常)发生时触发事务回滚。默认情况下,Spring 只对 RuntimeException 和 Error 回滚,而对 Exception 及其子类(如自定义检查型异常)不回滚。若你想让某个特定的非受检异常(比如自定义的 BusinessException,它继承自 RuntimeException)触发回滚,只需在注解中显式配置即可。
rollbackFor 要写具体异常类,不是字符串
rollbackFor 参数接收的是 Class extends Throwable>[] 类型,必须传入异常类的 字面量(.class),不能传字符串或实例。
- ✅ 正确写法:
rollbackFor = BusinessException.class - ❌ 错误写法:
rollbackFor = "BusinessException"或rollbackFor = new BusinessException().getClass()
非受检异常默认已回滚,但显式指定更清晰
像 IllegalArgumentException、NullPointerException 或你自定义的继承自 RuntimeException 的异常,本身属于非受检异常,Spring 默认就会回滚。但显式写上 rollbackFor 有两点好处:
- 增强可读性,让团队一眼看出哪些业务异常被认定为“失败信号”
- 避免因父类变更(比如某天把异常改成继承
Exception)导致意外不回滚
支持多个异常类型,用数组语法
如果多个异常都需要触发回滚,直接用花括号列出即可:
@Transactional(rollbackFor = {BusinessException.class, ValidationException.class})
注意:数组里可以混用不同层级的异常(如一个自定义 RuntimeException 子类 + 一个 Exception 子类),Spring 会统一按声明处理。
别和 noRollbackFor 混用时逻辑冲突
如果同时设置了 rollbackFor 和 noRollbackFor,且某个异常同时匹配两者,noRollbackFor 优先级更高,最终不会回滚。例如:
@Transactional(rollbackFor = RuntimeException.class, noRollbackFor = IllegalArgumentException.class)
此时 IllegalArgumentException 就不会触发回滚——尽管它属于 RuntimeException 的子类。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











