@transactional 生效必须满足四条件:方法为 public、通过 spring 代理对象调用(禁止 this 调用)、类被 spring 管理为 bean、数据库引擎支持事务;默认仅对 runtimeexception 和 error 回滚。

@Transactional 是 Spring 提供的声明式事务管理核心注解,它让开发者无需手动编写事务开启、提交或回滚逻辑,只需在方法或类上添加注解,Spring 就会自动代理并管理事务生命周期。
事务生效的前提条件
不是所有加了 @Transactional 的方法都会生效,必须满足以下几点:
- 目标方法必须是 public 的(非 public 方法调用时,AOP 代理无法拦截)
- 必须通过 Spring 容器管理的 Bean 调用该方法(即不能 this.method() 自调用)
- 类必须被 Spring 扫描并注册为 Bean(如使用 @Service、@Component 等)
- 项目需启用事务支持(通常 @EnableTransactionManagement 或 Boot 自动配置已搞定)
基本用法与回滚规则
默认情况下,Spring 只对 未检查异常(RuntimeException 及其子类)和 Error 自动回滚;对受检异常(如 Exception)不会回滚。
例如:
@Transactional
public void transferMoney(Long fromId, Long toId, BigDecimal amount) {
accountDao.debit(fromId, amount);
accountDao.credit(toId, amount);
// 若 credit 抛出 RuntimeException,debit 会自动回滚
}
如需对特定受检异常也回滚,可显式指定:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
@Transactional(rollbackFor = IOException.class)
public void readFileAndSave() throws IOException { ... }
若想避免某异常触发回滚,可用 noRollbackFor:
@Transactional(noRollbackFor = BusinessException.class)
传播行为控制多个事务的交互
当一个 @Transactional 方法调用另一个 @Transactional 方法时,传播行为决定如何处理事务上下文。最常用的是:
- REQUIRED(默认):如果当前存在事务,则加入;否则新建一个
- REQUIRES_NEW:总是挂起当前事务,新建独立事务(适合日志记录、异步通知等不希望影响主事务的场景)
- NESTED:嵌套事务(依赖 JDBC 保存点),外层回滚则内层也回滚,但内层可单独回滚而不影响外层
示例:
@Transactional
public void processOrder() {
orderDao.save(order);
notifyService.sendNotification(); // 使用 REQUIRES_NEW,失败不导致订单回滚
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void sendNotification() { ... }
注意事项与常见坑点
事务失效很常见,多数源于对 AOP 代理机制理解不足:
- 同一个类中,非事务方法直接调用本类的 @Transactional 方法 → 不会触发事务(因为没走代理)
- 事务方法抛出异常后被内部 try-catch 吞掉且未重新 throw → 事务不会回滚
- 数据库引擎不支持事务(如 MySQL 的 MyISAM 表)→ 即使加了注解也无效
- 事务方法返回值为基本类型或 void 时,注意不要在事务提交前修改返回对象状态(可能引发脏读或 NPE)
调试建议:开启 Spring 事务日志(logging.level.org.springframework.transaction=DEBUG),观察是否进入 TransactionInterceptor。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










