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 | 最终一致 | 高 | 高 | 长事务、微服务 |
| 本地消息表 | 最终一致 | 高 | 低 | 异步业务 |
要点总结
- XA 协议:通过两阶段提交实现分布式事务强一致性
- 核心语句:
XA START→XA END→XA PREPARE→XA COMMIT/ROLLBACK - 状态流转:ACTIVE → IDLE → PREPARED → 终结
- 注意事项:长时间锁定、TM 单点故障需监控处理
- 适用场景:强一致性要求高的传统业务系统
📝 发现内容有误?点击此处直接编辑