Seata
This content is not available in your language yet.
Seata 的源码主线不是“一个事务注解”,而是客户端拦截、TM/TC/RM 协作、分支注册、二阶段执行和失败重试组成的协议。阅读时先建立角色边界,再进入 AT 的数据库代理,最后对照 TCC、Saga 与 XA 的资源模型。
本册问题地图
Section titled “本册问题地图”Seata 要先分清 TM、TC、RM 的责任,再比较 AT、TCC、Saga 和 XA:
- 一次全局事务谁负责什么? TM 发起和结束全局事务,TC 维护全局状态与分支,RM 执行本地资源操作并上报结果。
- AT 为什么需要 undo log 和全局锁? 一阶段先提交本地 SQL,同时保存前镜像/后镜像;二阶段回滚依靠 undo log 恢复,并用全局锁减少并发覆盖。
- TCC 的空回滚和悬挂是什么? Try 未成功时 Cancel 也可能到达,必须安全地空回滚;Try 晚到则不能再执行,避免悬挂写入。
- 不同模式如何取舍? AT 对业务侵入较小但依赖 SQL 镜像和锁,TCC 控制精细但需要实现补偿,Saga 适合长流程,XA 依赖资源管理器的两阶段能力。
- TC 重启如何恢复? 依靠持久化事务状态、超时扫描、状态查询和幂等分支操作推进,而不是无条件重复 RPC。
| 项 | 值 |
|---|---|
| 仓库 | apache/incubator-seata |
| 本地路径 | E:\source\java\rpc\seata |
| 分支 | 2.x |
| Commit | e01f97c6db397165050caa6764020410c2c8199a |
| 快照日期 | 2026-08-14 |
| 最近 tag | v0.1.4(仅作祖先台账参考) |
本册源码坐标均基于上述 commit,行号随上游演进可能漂移。已有概念层说明见 Seata 概念笔记。
| 角色 | 主要模块 | 关键入口 |
|---|---|---|
| TM | tm、integration-tx-api |
GlobalTransactional、DefaultTransactionManager |
| RM | rm、rm-datasource、tcc、saga |
RMClient、ConnectionProxy、TCC/Saga handler |
| TC | server |
DefaultCoordinator、DefaultCore、Session |
| 通信 | core |
AbstractNettyRemoting、客户端/服务端 |
| 配置与发现 | config、discovery、namingserver |
注册、路由、集群发现 |
源码阅读路径
Section titled “源码阅读路径”- 从
GlobalTransactional和拦截器进入客户端事务边界。 - 顺着
DefaultTransactionManager看 TM 如何把 begin/commit/rollback 转成 RPC。 - 在
DefaultCoordinator和DefaultCore看 TC 如何创建会话、注册分支并按类型分派。 - 进入
ConnectionProxy、DML executor 和 undo log,理解 AT 的一阶段本地提交与二阶段补偿。 - 最后比较 TCC/Saga/XA 的资源操作与重试边界。