一文搞懂Seata底层原理:核心架构、事务模式、运行机制
Seata(Simple Extensible Autonomous Transaction Architecture)是阿里开源的分布式事务框架,核心目标是简化分布式事务开发,支持AT/TCC/SAGA/XA四种事务模式,底层通过“协调者-参与者”架构实现跨服务的数据一致性。本文从核心架构、核心模式原理、运行流程、关键机制四部分,彻底讲透Seata的底层逻辑。
一、Seata核心架构:3大核心角色
Seata的底层架构围绕“中心化协调+分布式执行”设计,核心包含3个角色,职责边界清晰:
| 角色 | 中文名称 | 部署形态 | 核心职责 |
|---|---|---|---|
| TC | 事务协调器 | 独立服务(集群) | 维护全局事务状态、协调全局事务提交/回滚、分配全局事务ID(XID) |
| TM | 事务管理器 | 嵌入应用(微服务) | 发起全局事务、注册全局事务到TC、触发全局提交/回滚 |
| RM | 资源管理器 | 嵌入应用(微服务) | 管理分支事务(与TC交互注册/上报状态)、执行本地事务、响应TC的提交/回滚指令 |
核心交互流程(极简版)
sequenceDiagram
participant TM (微服务A)
participant TC (Seata Server)
participant RM (微服务A)
participant RM (微服务B)
TM->>TC: 1. 发起全局事务,申请XID
TC-->>TM: 返回XID
TM->>RM(微服务A): 2. 执行本地分支事务(携带XID)
RM(微服务A)->>TC: 注册分支事务(XID+分支ID)
TC-->>RM(微服务A): 分支注册成功
RM(微服务A)-->>TM: 本地事务执行结果
TM->>RM(微服务B): 3. 调用微服务B(携带XID)
RM(微服务B)->>TC: 注册分支事务
TC-->>RM(微服务B): 分支注册成功
RM(微服务B)-->>TM: 本地事务执行结果
alt 所有分支成功
TM->>TC: 4. 提交全局事务
TC->>RM(微服务A): 提交分支事务
TC->>RM(微服务B): 提交分支事务
else 任一分支失败
TM->>TC: 4. 回滚全局事务
TC->>RM(微服务A): 回滚分支事务
TC->>RM(微服务B): 回滚分支事务
end
二、Seata四大事务模式:底层原理与执行逻辑
Seata的核心差异体现在四种事务模式的底层实现,其中AT模式是默认且最常用的(无侵入),TCC/SAGA为业务侵入式,XA为强一致模式。
1. AT模式(Auto Transaction):无侵入的最终一致性
AT模式是Seata的“王牌”,基于本地事务+自动补偿实现,对业务代码0侵入,底层分“执行阶段”和“提交/回滚阶段”:
(1)核心原理
- 前提:数据库支持本地事务、支持行锁、RM侧通过JDBC代理拦截SQL。
- 核心思想:“先执行,后补偿”——分支事务先执行并提交,异常时通过“前置镜像”反向补偿。
(2)两阶段执行流程
阶段1:分支事务执行(Try)
- SQL拦截:RM通过JDBC代理拦截业务SQL(如
UPDATE t_stock SET num=num-1 WHERE id=1)。 - 前置镜像查询:执行SQL前,先查询目标数据的原始状态(如
SELECT num FROM t_stock WHERE id=1),记录为“前置镜像”。 - 执行业务SQL:执行实际的更新操作。
- 后置镜像查询:执行SQL后,查询更新后的状态,记录为“后置镜像”。
- 分支注册:将XID、分支ID、镜像数据上报TC,然后提交本地事务(重点:AT模式阶段1就提交本地事务,无锁阻塞)。
阶段2:全局提交/回滚
- 全局提交:TC通知所有RM提交分支 → RM直接删除镜像数据(无实际业务操作,轻量)。
- 全局回滚:TC通知所有RM回滚分支 → RM根据“前置镜像”生成补偿SQL(如
UPDATE t_stock SET num=10 WHERE id=1),执行补偿并删除镜像数据。
(3)关键保障机制
- 脏写防护:执行SQL时通过
FOR UPDATE加行锁,防止并发修改导致数据不一致。 - 幂等/空回滚/悬挂:内置状态管理,自动处理这三类异常(无需业务代码干预)。
(4)底层存储
- TC侧:存储全局事务状态、分支事务信息(支持MySQL/Redis等)。
- RM侧:临时存储镜像数据(表名:
undo_log),事务完成后删除。
2. TCC模式(Try-Confirm-Cancel):业务侵入式高性能
Seata的TCC模式是对标准TCC的封装,底层核心是“业务接口化+状态管控”:
(1)底层执行逻辑
- 接口定义:业务需实现3个接口(
prepare/commit/rollback),并通过注解标记(@TccAction)。 - 阶段1(Try):TM发起全局事务,调用RM的
prepare方法(资源预占),RM将分支状态上报TC。 - 阶段2(Confirm/Rollback):TC根据全局状态,调用RM的
commit(确认预占资源)或rollback(释放预占资源)。
(2)Seata的增强
- 自动处理空回滚/悬挂/幂等:通过TC维护的分支状态,自动校验并拦截异常请求。
- 无锁设计:阶段1不提交最终业务,仅预占资源,无长期锁阻塞。
3. SAGA模式:长事务适配
Seata的SAGA模式针对长流程分布式事务设计,底层基于“状态机+补偿链”实现:
(1)核心原理
- 事务定义:通过JSON/YAML定义SAGA状态机(如
下单→扣库存→减余额的正向流程,减余额失败→补偿减余额→补偿扣库存→补偿下单的反向流程)。 - 状态驱动:TC根据状态机定义,驱动各RM执行正向/补偿操作。
- 补偿执行:支持“串行/并行”补偿,支持重试(失败自动重试,可配置重试策略)。
(2)底层特点
- 无锁:所有分支事务均为本地提交,无资源锁定。
- 柔性:允许部分节点失败后重试,适配长流程(如订单履约、旅行预订)。
4. XA模式:强一致性(兼容标准XA协议)
Seata的XA模式是对数据库XA协议的封装,底层完全遵循2PC流程:
(1)执行逻辑
- 阶段1(Prepare):RM执行本地事务,但不提交(XA prepare),上报状态到TC。
- 阶段2(Commit/Rollback):TC通知所有RM提交(XA commit)或回滚(XA rollback)。
(2)底层特点
- 强一致:完全遵循ACID,适合金融核心场景。
- 性能差:阶段1持有数据库锁,同步阻塞,仅适合低并发场景。
三、Seata底层关键机制:稳定性保障
1. 通信机制
- 底层基于Netty实现TC-RM/TM的长连接通信,支持心跳检测、断线重连。
- 协议:自定义TCP协议(Seata Protocol),轻量且高效。
2. 高可用机制
- TC集群化:通过注册中心(Nacos/Eureka)实现TC集群部署,TM/RM自动发现可用TC节点。
- 数据持久化:TC的事务状态持久化到数据库/Redis,宕机重启后可恢复。
- 重试机制:RM与TC通信失败时,自动重试(可配置重试次数/间隔)。
3. 序列化与存储
- 序列化:默认使用Hessian,支持JSON/Protobuf(高性能场景推荐Protobuf)。
- 存储选型:
- 测试/轻量场景:TC使用File存储(无需数据库)。
- 生产场景:TC使用MySQL/PostgreSQL(事务状态持久化),RM的undo_log存储在业务库。
四、Seata底层与传统分布式事务的差异
| 特性 | Seata AT模式 | 传统2PC(XA) | 手写TCC |
|---|---|---|---|
| 侵入性 | 0侵入(业务无感知) | 低侵入(数据库层) | 高侵入(需写3个接口) |
| 性能 | 高(阶段1提交,无锁) | 低(阶段1持锁,阻塞) | 中高(无锁,业务优化) |
| 一致性 | 最终一致 | 强一致 | 最终一致 |
| 异常处理 | 自动处理(幂等/空回滚/悬挂) | 手动处理 | 手动处理 |
| 适用场景 | 微服务通用场景 | 金融核心强一致场景 | 高并发短事务 |
五、总结
- 核心架构:Seata通过TC(协调)、TM(发起)、RM(执行)三层架构实现分布式事务,所有操作围绕XID(全局事务ID) 关联。
- 核心模式:AT模式是Seata的核心(0侵入、最终一致),底层通过“镜像数据+自动补偿”实现;TCC/SAGA适配高并发/长事务,XA适配强一致场景。
- 关键保障:Seata内置幂等、空回滚、悬挂等异常处理机制,底层通过Netty通信、集群化部署保证高可用,相比传统方案更轻量、更适配微服务。
百流积聚,江河是也;文若化风,可以砾石。

浙公网安备 33010602011771号