@transactional默认只对runtimeexception及其子类和error回滚,对ioexception等受检异常不自动回滚;需通过rollbackfor显式指定,且异常必须未被捕获、经代理调用才生效。

Java中@Transactional默认只对RuntimeException及其子类(即运行时异常)和Error回滚,而对受检异常(checked exception,如IOException、SQLException等)**不会自动回滚**。若需让受检异常也触发回滚,必须显式配置rollbackFor属性。
指定 rollbackFor 属性支持受检异常
在@Transactional注解中,通过rollbackFor参数传入具体的异常类(或其父类),Spring就会在抛出该类型异常时执行回滚。
- 支持单个异常:
@Transactional(rollbackFor = IOException.class) - 支持多个异常:
@Transactional(rollbackFor = {IOException.class, SQLException.class}) - 可指定异常的父类(如
Exception.class),但需谨慎——这会让所有继承自Exception的异常(包括业务异常)都回滚,可能掩盖设计意图
注意异常必须实际抛出且未被吞掉
即使配置了rollbackFor,若异常在方法内被try-catch捕获后未重新抛出,事务依然不会回滚。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- ❌ 错误写法:捕获后仅记录日志,未抛出
- ✅ 正确写法:捕获后重新抛出原异常或包装为允许回滚的异常(如
throw new RuntimeException(e)),或直接不捕获
确保事务代理生效
@Transactional基于Spring AOP代理,有几点限制需注意:
- 只能作用于public方法;private/protected方法上标注无效
- 自调用失效:同一个类中,非事务方法调用本类的
@Transactional方法,事务不生效(因绕过了代理) - 检查是否启用事务管理:
@EnableTransactionManagement(Spring Boot默认已启用)
替代方案:使用 noRollbackFor 精细控制
如果大部分受检异常要回滚,但个别例外(如某些业务校验异常不应影响数据一致性),可用noRollbackFor排除:
@Transactional(rollbackFor = Exception.class, noRollbackFor = BusinessException.class)- 此时除
BusinessException外,其他Exception均会回滚
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










