Spring声明式事务通过@Transactional注解保障多步数据库操作原子性,需满足public方法、代理调用、单一数据源、统一事务方法体等条件,并按需配置传播行为、隔离级别、超时及只读属性。

Spring 声明式事务通过 @Transactional 注解实现业务一致性,核心是让多步数据库操作具备原子性——全部成功或全部回滚,避免“部分执行”导致的数据错乱。
启用事务管理支持
Spring Boot 项目默认已开启事务管理,但需确认两点:
- 确保项目中存在且仅有一个
PlatformTransactionManagerBean(如DataSourceTransactionManager),Spring Boot 会自动装配;若配置了多个数据源,需用@Primary标注默认事务管理器 - 虽 Spring Boot 2.0+ 自动启用,但显式添加
@EnableTransactionManagement到启动类或配置类更清晰、便于排查
@Transactional 正确使用方式
注解生效有明确限制,不满足则事务静默失效:
- 必须标注在 public 方法 上,private/protected 方法加注解无效
- 调用必须经过 Spring 代理:方法需由其他 Spring Bean(如通过
@Autowired注入)调用,不能在本类内this.createOrder()自调用 - 推荐放在 Service 层方法上,不建议加在 Controller(职责不清)或 Mapper(非业务边界)层
- 默认只对
RuntimeException和Error回滚;若业务异常(如BusinessException)也要触发回滚,需显式声明:@Transactional(rollbackFor = BusinessException.class)
保障多表操作一致性
只要满足以下条件,插入订单、扣库存、更新积分等跨表操作就能被纳入同一事务:
立即学习“Java免费学习笔记(深入)”;
- 所有 DAO 操作使用同一数据源(如同一个
DataSource) - 全部操作在同一个
@Transactional方法体内执行(不能拆到多个事务方法中) - 使用 Spring 管理的模板或框架组件(如
JdbcTemplate、MyBatisMapper、JPARepository),它们会自动绑定当前线程的事务连接
关键属性按需配置
根据业务场景调整事务行为,避免默认值引发问题:
-
propagation = Propagation.REQUIRED(默认):有事务则加入,无则新建;适合绝大多数业务入口 -
isolation = Isolation.READ_COMMITTED:防止脏读,兼顾性能与一致性,生产环境常用 -
timeout = 30:设置超时秒数,防止单个长事务阻塞资源 -
readOnly = true:用于纯查询方法,可提升数据库优化空间


















