Appearance
全局事务与分支事务
三个定义(原文)
- 事务
一个事务是一个完整的工作单元,由多个独立的计算任务组成,这多个任务在逻辑上是原子的
- 全局事务
对于一次性操作多个资源管理器的事务,就是全局事务
- 分支事务
在全局事务中,某一个资源管理器有自己独立的任务。这些任务的集合作为这个资源管理器的分支任务
一、站在 DTP 模型里看这两个概念
全局/分支不是凭空发明的词,它们来自 X/Open DTP 模型的三个角色(模型详见 XA协议 的 DTP 节):
┌────────────── AP(应用程序)──────────────┐
│ 定义事务边界:执行业务 SQL / 发消息 │
└───────┬──────────────────────▲───────────┘
向 TM 注册全局事务 询问结果/上报
┌───────▼──────────────────────┴───────────┐
│ TM(事务管理器/协调者) │
│ 颁发 XID、记录决策、指挥提交或回滚 │
└──┬───────────▲──────────┬───────────────┘
xa_start/end prepare/ xa_start/end
(标记分支) commit (标记分支)
┌──▼────┐ ┌──▼────┐ ┌──▼────┐
│RM:DB1│ │RM:DB2│ │RM:MQ │
└───────┘ └───────┘ └───────┘
分支事务 分支事务 分支事务- AP:亲自执行业务操作,但不懂"跨资源提交"这件事;
- TM:全局事务的持有者——AP 向它注册,它颁发全局事务标识,并统筹两阶段;
- RM:每个资源节点(一个 MySQL 实例、一个 MQ)上,属于本次全局事务的那部分工作,就是一个分支事务。
一句话:全局事务是 TM 视角的整体,分支事务是各 RM 视角的局部,两者靠同一个 XID 关联。
二、全局事务的协调过程(两阶段视角)
XA 的 XID 由三部分语义组成:formatID(格式标识)+ gtrid(全局事务号)+ bqual(分支限定符),同一个全局事务下各分支共享 gtrid、以 bqual 区分。流程:
AP ──注册──► TM ──颁发 XID──► AP
AP ──xa_start(XID)──► RM1 ──执行 SQL──► AP ──xa_end(XID)──► RM1
(RM2、RM3 同理,各自标记出自己的分支)
阶段一 prepare:TM ──xa_prepare(XID)──► 所有 RM
各 RM 持久化分支的 redo/undo,锁定资源,回答 Yes/No
阶段二 commit/rollback:TM 按投票结果发最终指令
任一 No 或超时 ──► 全部 xa_rollback;全部 Yes ──► 全部 xa_commitTM 在这个过程中的职责清单:分配并传播 XID、持久化自己的决策(防 TM 崩溃后失忆)。收集投票、发布提交/回滚指令。故障恢复期用 xa_recover 找回 prepare 过但未决的分支。接口语义逐条拆解见 XA协议,协议本身的缺陷与流程细节见 分布式理论-2PC。
三、分支事务的"本地性"
分支事务在本地上就是个普通本地事务,这带来三层含义:
- 资源和日志在本地:分支有自己的 undo/redo 日志、自己的行锁。锁的持有范围就是分支所在的 RM,不会跨资源加锁;
- 一个 RM 上可以有多个分支。同一全局事务里,TM 可以对同一 RM 先后执行多对 xa_start/xa_end。先记一笔流水 INSERT,再做一个账户 UPDATE,就是两个分支;
- "能不能提交"在本地,"要不要提交"在全局。分支执行完只是待命,prepare 之后进入未决(in-doubt)状态。即使 TM 短暂失联,分支也能凭本地日志独立恢复——MySQL 里
XA RECOVER列出的就是这些悬挂分支。
全局事务(XID=100)落地后的形态:
DB1:分支 XID=100/b1(订单 INSERT) ┐
DB1:分支 XID=100/b2(流水 INSERT) ├─ 整体成或整体败
DB2:分支 XID=100/b3(账户 UPDATE) ┘四、对照表与追问链
| 维度 | 全局事务 | 分支事务 |
|---|---|---|
| 视角 | TM(协调者) | 单个 RM(参与者) |
| 标识 | gtrid 部分 | gtrid + bqual(bqual 区分兄弟分支) |
| 生命周期决定者 | TM 的两阶段决策 | 本地执行 + 等待 TM 指令 |
| 资源范围 | 跨所有参与的 RM | 单 RM 内部 |
| 故障表现 | TM 单点会导致整体阻塞 | prepare 后悬挂(in-doubt),靠 xa_recover 恢复 |
追问链:全局事务和本地事务差在哪 → 跨多个 RM 才叫全局。XID 怎么构成 → formatID+gtrid+bqual。一个 RM 能有几个分支 → 多个,每对 xa_start/xa_end 一个。commit 指令只送到一半会怎样 → 不一致窗口,TM 靠持久化决策重发直至成功。这套术语在工程上对应什么 → Seata 的 XID 传播、MySQL XA 事务,见 分布式事务解决方案。
延伸阅读:XA协议(含 X/Open DTP 模型)、分布式理论-2PC、什么是分布式事务?、刚性事务与柔性事务、分布式事务解决方案。
2026-10 扩充(原内容过薄)。