全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-15 10 分钟 ✍️ juanwangdev

MySQL 分布式事务与XA协议

分布式事务用于跨多个数据库实例保证数据一致性,MySQL 通过 XA 协议实现。

XA 协议基础

核心概念

XA(eXtended Architecture)是 X/Open 组织提出的分布式事务处理标准,采用**两阶段提交(2PC)**保证原子性。

关键角色:

  • AP(Application):应用程序,定义事务边界
  • TM(Transaction Manager):事务管理器,协调全局事务
  • RM(Resource Manager):资源管理器,即数据库实例

两阶段提交流程

SQL
阶段1:准备阶段(Prepare)
  TM → RM1: PREPARE
  TM → RM2: PREPARE
  RM1 → TM: OK
  RM2 → TM: OK

阶段2:提交阶段(Commit/Rollback)
  TM → RM1: COMMIT
  TM → RM2: COMMIT
  所有分支提交成功,事务完成
阶段动作说明
Prepare各 RM 准备提交持有锁,写入 Undo Log
Commit各 RM 正式提交释放锁,持久化数据
Rollback任一 RM 失败则回滚全部回滚,释放锁

MySQL XA 语法

基本语句

SQL
-- 开启 XA 事务,xid 为全局事务标识
XA START 'xid';

-- 执行业务 SQL
INSERT INTO orders (order_id, amount) VALUES (1, 100);

-- 结束事务分支
XA END 'xid';

-- 准备提交(阶段1)
XA PREPARE 'xid';

-- 提交(阶段2)
XA COMMIT 'xid';

-- 或回滚
XA ROLLBACK 'xid';

查看 XA 事务状态

SQL
-- 查看当前 XA 事务
XA RECOVER;

-- 输出示例
-- formatID: 1
-- gtrid_length: 3
-- bqual_length: 0
-- data: xid
-- status: PREPARED

完整分布式事务示例

SQL
-- 节点1:订单库
XA START 'order_transfer_001';
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
XA END 'order_transfer_001';
XA PREPARE 'order_transfer_001';

-- 节点2:库存库
XA START 'order_transfer_001';
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
XA END 'order_transfer_001';
XA PREPARE 'order_transfer_001';

-- 两节点都 PREPARE 成功后,依次提交
-- 节点1
XA COMMIT 'order_transfer_001';

-- 节点2
XA COMMIT 'order_transfer_001';

XA 事务状态流转

ini
XA START → ACTIVE
    ↓
XA END → IDLE
    ↓
XA PREPARE → PREPARED
    ↓
XA COMMIT / XA ROLLBACK → 终结
状态含义
ACTIVE事务执行中
IDLE事务结束,等待 PREPARE
PREPARED已准备,等待 COMMIT/ROLLBACK

生产环境注意事项

1. 长时间锁定问题

⚠️ XA 事务在 PREPARE 阶段持有行锁,若 TM 故障,资源被长时间锁定。

解决方案:

  • 设置 xa_detach_on_prepare = ON(MySQL 8.0+)
  • 监控 XA RECOVER 及时处理悬挂事务

2. 单点故障

TM 故障导致事务悬挂,需人工介入:

text
-- 查看悬挂事务
XA RECOVER;

-- 根据业务决定提交或回滚
XA COMMIT 'hanging_xid';
-- 或
XA ROLLBACK 'hanging_xid';

3. 性能考量

特性说明
网络开销多轮交互,延迟增加
锁持有时间2PC 期间锁定资源
吞吐量比本地事务低 30%-50%

4. 推荐配置

text
[mysqld]
# 启用 XA
xa_detach_on_prepare = ON

# 事务隔离级别
transaction-isolation = READ-COMMITTED

与其他方案对比

方案一致性性能复杂度适用场景
XA/2PC强一致传统数据库、金融核心
TCC最终一致高并发业务
Saga最终一致长事务、微服务
本地消息表最终一致异步业务

要点总结

  1. XA 协议:通过两阶段提交实现分布式事务强一致性
  2. 核心语句XA STARTXA ENDXA PREPAREXA COMMIT/ROLLBACK
  3. 状态流转:ACTIVE → IDLE → PREPARED → 终结
  4. 注意事项:长时间锁定、TM 单点故障需监控处理
  5. 适用场景:强一致性要求高的传统业务系统

📝 发现内容有误?点击此处直接编辑

← 上一篇 MySQL 主从复制与读写分离
下一篇 → MySQL 分库分表策略
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库