Skip to content

全局事务与分支事务 ​

三个定义(原文) ​

  • 事务

一个事务是一个完整的工作单元,由多个独立的计算任务组成,这多个任务在逻辑上是原子的

  • 全局事务

对于一次性操作多个资源管理器的事务,就是全局事务

  • 分支事务

在全局事务中,某一个资源管理器有自己独立的任务。这些任务的集合作为这个资源管理器的分支任务

一、站在 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_commit

TM 在这个过程中的职责清单:分配并传播 XID、持久化自己的决策(防 TM 崩溃后失忆)。收集投票、发布提交/回滚指令。故障恢复期用 xa_recover 找回 prepare 过但未决的分支。接口语义逐条拆解见 XA协议,协议本身的缺陷与流程细节见 分布式理论-2PC。

三、分支事务的"本地性" ​

分支事务在本地上就是个普通本地事务,这带来三层含义:

  1. 资源和日志在本地:分支有自己的 undo/redo 日志、自己的行锁。锁的持有范围就是分支所在的 RM,不会跨资源加锁;
  2. 一个 RM 上可以有多个分支。同一全局事务里,TM 可以对同一 RM 先后执行多对 xa_start/xa_end。先记一笔流水 INSERT,再做一个账户 UPDATE,就是两个分支;
  3. "能不能提交"在本地,"要不要提交"在全局。分支执行完只是待命,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 扩充(原内容过薄)。