Spring声明式事务通过@Transactional注解实现,基于AOP代理,仅对public的Spring管理Bean方法生效;需配置事务管理器,传播行为默认REQUIRED,rollbackFor可指定检查异常回滚。

Spring 声明式事务的核心是用 @Transactional 注解替代手动事务控制,让业务代码专注逻辑,框架自动处理开启、提交或回滚。它基于 AOP 和代理机制实现,配置简单但细节关键。
基础依赖与启用条件
确保项目中已引入事务支持模块:
- Spring Boot 项目:只需
spring-boot-starter-jdbc或spring-boot-starter-data-jpa,spring-tx会自动传递引入,无需额外配置; - 传统 Spring(非 Boot)项目:需显式添加
spring-tx依赖,并在配置类上加@EnableTransactionManagement; - 事务管理器(如
DataSourceTransactionManager)必须存在且被 Spring 扫描到——通常由自动配置或手动 Bean 定义完成。
@Transactional 的作用位置与生效规则
该注解可加在类或方法上,但有明确限制:
- 只对 public 方法 生效;修饰 private、protected 或包级方法无效;
- 加在类上时,该类所有 public 方法默认启用事务(仍可被子方法上的同名注解覆盖);
- 注解必须作用于 Spring 管理的 Bean(即通过
@Service、@Component等注册的类),直接 new 出来的对象不走代理,事务失效; - 同一类内方法互相调用(如 A 方法调 B 方法),若 B 加了
@Transactional,但 A 没有代理介入,B 的事务也不会生效——这是常见失效点。
常用属性配置说明
通过注解参数可精细控制事务行为:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
-
propagation:传播行为,默认
REQUIRED(加入现有事务或新建);REQUIRES_NEW强制新建独立事务,适合日志记录等需隔离的场景; -
isolation:隔离级别,默认由数据库决定(通常是
READ_COMMITTED),可设为REPEATABLE_READ防止不可重复读; -
readOnly:设为
true可提示数据库优化查询,同时避免误写操作(部分数据库驱动会校验); - timeout:单位秒,超时自动回滚,防止长事务阻塞资源;
-
rollbackFor:指定哪些异常触发回滚,默认只响应
RuntimeException和Error;若需对Exception子类(如IOException)也回滚,必须显式声明; - noRollbackFor:明确排除某些异常不触发回滚。
典型使用示例
一个用户注册并记录日志的事务方法:
@Service
public class UserService {
@Transactional(rollbackFor = BusinessException.class, timeout = 10)
public void register(User user) {
userDao.insert(user);
logService.record("user_registered", user.getId());
// 若此处抛出 BusinessException,整个操作回滚
if (user.isInvalid()) {
throw new BusinessException("注册信息不合法");
}
}
}
注意:异常必须未被捕获才会触发回滚;如果在方法内 try-catch 住并吞掉异常,Spring 认为执行成功,事务照常提交。

















