java事务需根据场景选择机制:单数据库用本地事务(@transactional),跨服务需分布式事务(如seata、tcc);配置关键在事务管理器、方法可见性、异常处理及上下文透传。

Java事务不是配出来的,是理清楚边界、选对机制、写对代码才稳得住的。
先搞清你面对的是哪种事务场景
- 单数据库、单服务里的操作(比如订单+库存扣减在同一个MySQL里)→ 用本地事务,Spring
@Transactional就够用 - 跨多个数据库、或跨微服务(比如订单服务 + 库存服务 + 支付服务)→ 必须上分布式事务,不能靠
@Transactional硬扛
本地事务怎么“配”?其实就三步,缺一不可
开启事务管理
Spring Boot 项目默认已启用,但要确认主类或配置类上有@EnableTransactionManagement(非必须,Boot 自动装配),或确保spring-boot-starter-jdbc/spring-boot-starter-data-jpa已引入。-
配好事务管理器(关键!)
如果用的是 JDBC 或 MyBatis,需有DataSourceTransactionManager;
如果是 JPA,会自动配JpaTransactionManager。
手动配示例(不推荐盲目复制,看数据源类型):@Bean public PlatformTransactionManager transactionManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } -
方法上加
@Transactional,但注意这些细节:
Alibabacloud Sdk Client Initialization For Java下载在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 只能加在 public 方法 上(AOP代理限制)
- 默认只对 unchecked 异常(RuntimeException 及其子类)回滚,如需对
Exception也回滚,得写:@Transactional(rollbackFor = Exception.class) - 不要自己
try-catch异常后吞掉——不抛出,事务就不知道该回滚 - 避免在同一个类里调用本类带
@Transactional的方法(内部调用绕过代理,事务失效)
分布式事务怎么“配”?看架构选路子
| 方案 | 适用场景 | 配置要点 |
|---|---|---|
| JTA + Atomikos/Narayana | 多数据源(同服务内连 MySQL + Oracle)、强一致性要求高 | 引入 atomikos 依赖,替换 DataSource 为 AtomikosDataSourceBean,配 JtaTransactionManager
|
| Seata(AT 模式) | 微服务间 MySQL/Oracle 分库分表,想尽量少改业务代码 | 启动 Seata Server,每个服务加 seata-spring-boot-starter,@GlobalTransactional 替换 @Transactional,数据库加 undo_log 表 |
| TCC 模式 | 对性能和可控性要求高,能接受业务侵入(Try/Confirm/Cancel 三段逻辑) | 不依赖全局事务协调器,但每个服务要实现三个接口,需自行保证 Confirm/Cancel 幂等与重试 |
| Saga 模式 | 长流程、最终一致性可接受(如下单→扣库存→发券→通知) | 用框架如 ServiceComb Saga 或自定义补偿链,重点设计好补偿动作和异常恢复策略 |
⚠️ 提醒:别一上来就配分布式事务。80% 的“以为需要分布式事务”的场景,其实是服务拆分过早、接口设计不合理,或者没用好本地事务+可靠消息(比如 RocketMQ 事务消息)。
最后检查清单(配完别急着跑,先扫一遍)
- 数据库引擎是否支持事务?(MySQL 用 InnoDB,别用 MyISAM)
- 方法是否是 public?是否被本类其他方法直接调用?
- 异常有没有被静默 catch?是否符合 rollbackFor 默认规则?
- 多数据源时,是否指定了
@Transactional(transactionManager = "xxx")? - 分布式场景下,全局事务 ID 是否透传?各服务是否都接入了同一套协调器?
配事务,本质是配“信任链”——让每一步操作都清楚自己属于哪个事务上下文,失败时知道找谁回滚。不复杂,但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










