什么是 rollbackFor?
在 Spring 框架中,@Transactional 注解用于声明式事务管理。
其中的 rollbackFor 属性用于指定在抛出哪些异常时触发事务回滚。
默认情况下,Spring 只会在遇到 未检查异常(unchecked exception)(即继承自 RuntimeException 或 Error 的异常)时自动回滚事务。
如果希望在抛出 检查异常(checked exception) 时也回滚事务,就需要显式配置 rollbackFor。
基本用法示例
@Transactional(rollbackFor = Exception.class)
public void transferMoney(Account from, Account to, BigDecimal amount) {
// 业务逻辑
if (amount.compareTo(from.getBalance()) > 0) {
throw new InsufficientFundsException("余额不足"); // 假设这是个 checked exception
}
// 扣款、转账等操作
}
上述代码中,即使 InsufficientFundsException 是一个检查异常,
由于设置了 rollbackFor = Exception.class,事务仍会回滚。
常见配置方式
rollbackFor = Exception.class:所有异常(包括 checked)都回滚。rollbackFor = {SQLException.class, IOException.class}:指定多个异常类型。- 不设置
rollbackFor:仅 RuntimeException 和 Error 会触发回滚。
注意事项
- 异常必须被 抛出到事务代理层 才能生效,如果在方法内部 catch 了异常且未重新抛出,事务不会回滚。
- rollbackFor 与 noRollbackFor 可配合使用,实现更精细的控制。