什么是 XA 分布式事务
XA 是 X/Open 组织 1991 年定义的分布式事务接口:事务管理器(TM)通过 XA 接口协调多个资源管理器(RM,如数据库、消息中间件),用两阶段提交保证跨资源的原子性。它的优势是跨异构资源可用、语义标准;代价是分支事务期间连接与锁被长期占用,协调者故障会带来阻塞与恢复复杂度。
基本信息
| 角色 | 事务管理器(TM)协调,资源管理器(RM)执行分支 |
|---|---|
| 典型场景 | 同一事务内更新多个数据库,或数据库与消息中间件 |
| 主要代价 | 两阶段提交期间连接与锁长期占用,吞吐受限 |
| 风险点 | 跨数据中心延迟放大,协调者故障需人工处理悬挂事务 |
典型使用场景
- 同构多库事务:同一应用需要原子更新两个关系型库,且都支持 XA
- 数据库与消息:以 XA 保证「写库与发消息」同时成功或同时失败
- 遗留系统集成:老平台只提供 XA 接口,短期无法改造为事件驱动
- 低并发强一致场景:交易笔数不高但对原子性要求严格
- 过渡方案:在事件驱动改造完成前,用 XA 兜住一致性缺口
- 排障与审计:通过 TM 的事务日志排查悬挂与未决分支
XA 事务轮廓(SQL 示意)
XA 事务轮廓(SQL 示意)
XA START 'tx-42'; -- 开启 XA 事务
UPDATE orders SET status = 1 WHERE id = 7; -- 分支:修改订单
XA END 'tx-42'; XA PREPARE 'tx-42'; -- 第一阶段:准备
-- 所有分支都 PREPARE 成功后,由协调者决定提交
XA COMMIT 'tx-42'; -- 第二阶段:提交
-- 失败路径:XA ROLLBACK 'tx-42';
-- 排查悬挂:SHOW ENGINE INNODB STATUS 或 XA RECOVER 查看未决分支替代方案对照
| 方案 | 一致性 | 适用判断 |
|---|---|---|
| XA 两阶段提交 | 强一致,跨异构资源 | 并发低、资源数少、都必须原子提交 |
| Saga 编排 | 最终一致,含补偿 | 微服务、长流程、允许中间态 |
| 本地消息表 | 最终一致,实现简单 | 同一库内落业务与消息,再异步投递 |
| TCC | 最终一致,业务侵入大 | 需要预留资源与显式确认的金融场景 |
微服务场景通常用 Saga 或本地消息表替代 XA:先评估一致性要求与故障恢复流程,再决定是否值得付出两阶段提交的代价。
XA 分支期间连接与锁被长期占用:高并发下连接池会迅速耗尽,跨数据中心部署风险更高。