seata分布式事务核心是tc、tm、rm三角色协同:tc为独立server,tm用@globaltransactional发起全局事务,rm代理数据源并管理undo_log;需搭建seata server、引入依赖、配置数据源代理及application.yml,并注意at模式下建undo_log表、主键类型、隔离级别与异常处理。

在 Spring Boot 中集成 Seata 实现分布式事务一致性,核心是让多个微服务的本地事务受同一个全局事务(XID)协调,确保跨库、跨服务操作“全成功或全回滚”。关键不在于写多少代码,而在于角色对齐、配置准确、模式选对。
明确 Seata 的三个核心角色
集成前必须理解 Seata 的协作机制:
- TC(Transaction Coordinator):独立部署的 Seata Server,负责全局事务状态管理与协调,所有服务都向它注册分支事务;
-
TM(Transaction Manager):发起全局事务的服务(如订单服务),调用
@GlobalTransactional即为 TM 角色; - RM(Resource Manager):参与事务的服务(如库存、账户服务),需代理数据源,自动记录 undo_log 并响应 TC 的提交/回滚指令。
搭建 Seata Server(TC)
这是前置必要条件,不能省略。推荐使用 Docker 快速启动:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 拉取镜像:
docker pull seataio/seata-server:1.8.0(建议用稳定版); - 运行容器:
docker run -d --name seata-server -p 8091:8091 -e SEATA_IP=127.0.0.1 seataio/seata-server:1.8.0; - 确认可用:访问
http://localhost:8091(默认账号密码均为seata); - 若用 Nacos 作注册中心,需提前在 Nacos 控制台创建命名空间和配置组(如
SEATA_GROUP),并上传seataServer.properties配置。
Spring Boot 项目端集成(RM + TM)
以 AT 模式(最常用、侵入最小)为例,分四步完成:
-
引入依赖:在
pom.xml中添加seata-spring-boot-starter(注意版本兼容 Spring Boot 2.x/3.x); -
代理数据源:Seata 要拦截 SQL,必须用
DataSourceProxy包装原始数据源。Spring Boot 2.6+ 默认启用自动代理,但建议显式配置 Bean:
@Configuration
public class DataSourceConfig {
@Bean
@Primary
public DataSourceProxy dataSourceProxy(DataSource dataSource) {
return new DataSourceProxy(dataSource);
}
}
-
配置 application.yml:指定注册中心(Nacos/ZooKeeper)、事务分组、服务名等,关键项包括:
seata.tx-service-group、seata.registry.type、seata.service.vgroup-mapping.xxx; -
标注全局事务入口:在发起方服务的方法上加
@GlobalTransactional(不要用@Transactional替代),该注解会触发 TM 行为,并将 XID 透传至下游服务。
AT 模式下需特别注意的细节
AT 模式虽易用,但几个隐性要求常被忽略:
- 所有参与服务的数据库必须是支持本地事务的关系型库(MySQL 5.7+、PostgreSQL 等),且需建好
undo_log表(Seata 提供建表 SQL); - 业务表主键必须是
BIGINT或INT类型,否则 undo_log 解析可能失败; - 读已提交(RC)隔离级别下,AT 默认提供“读未提交”全局隔离;如需强读一致,必须对关键查询加
SELECT FOR UPDATE,Seata 会自动为其申请全局锁; - 避免在
@GlobalTransactional方法内手动捕获异常却不抛出——Seata 依赖异常传播触发回滚,吞掉异常等于绕过事务控制。










