Spring事务默认仅对RuntimeException及其子类自动回滚,对Exception及其子类(如自定义受检异常)需显式配置rollbackFor属性;若自定义异常继承Exception,则必须在@Transactional中指定rollbackFor=BizException.class等。

Spring 事务默认只对 RuntimeException 及其子类(即非受检异常)自动回滚,而对 Exception 及其子类(包括自定义的受检异常)不会自动回滚。若想让事务在抛出某个自定义受检异常时也回滚,必须显式配置 rollbackFor 属性。
明确自定义异常是否继承 Exception
确保你的自定义异常是 Exception 的子类(即受检异常),例如:
如果是 RuntimeException 子类(如 BizRuntimeException),默认就会回滚,无需额外配置 rollbackFor。
@Transactional 中指定 rollbackFor
在方法或类上添加 @Transactional 注解,并通过 rollbackFor 明确列出要触发回滚的异常类型:
立即学习“Java免费学习笔记(深入)”;
- 支持单个异常:
rollbackFor = BizException.class - 支持多个异常:
rollbackFor = {BizException.class, IOException.class} - 可同时指定
noRollbackFor排除某些例外情况(慎用)
注意异常必须被真实抛出且未被捕获
事务切面只对传播到代理层的异常生效。以下情况会导致回滚失效:
- 方法内
try-catch吞掉了异常,未重新抛出 - 捕获后抛出另一个未在
rollbackFor中声明的异常 - 使用了
throws声明但实际未抛出该异常
正确写法示例:
@Transactional(rollbackFor = BizException.class)public void transfer() throws BizException {
if (balance < amount) {
throw new BizException("余额不足");
}
// 扣款、记账等操作
}
全局配置 fallback(可选)
如果多数事务都需要对某类受检异常回滚,可通过编程方式统一设置(不推荐覆盖默认行为),更稳妥的做法仍是每个需要的地方显式声明 rollbackFor。Spring 不支持 XML 或全局注解默认开启受检异常回滚,这是设计上的明确取舍。


















