以下是主流分布式事务中间件的原理分析及适用场景对比,结合工业实践总结而成:
📊 分布式事务中间件核心方案对比
| 中间件 | 核心原理 | 事务模型 | 适用场景 |
|---|---|---|---|
| Seata | 全局事务协调器(TC)管理分支事务(RM),通过事务ID串联多阶段操作 | AT/TCC/XA/Saga | 微服务强一致性场景(如支付、订单) |
| RocketMQ事务消息 | 两阶段提交 + 状态回查:半消息暂存→本地事务→提交/回滚→Broker投递 | 最终一致性 | 异步解耦场景(订单-库存扣减) |
| XA/JTA | 基于2PC协议,数据库原生支持,TM协调多个RM(数据库)的Prepare/Commit | 强一致性 | 传统银行系统、跨数据库事务 |
⚙️ 一、Seata(核心:事务协调器+多模式支持)
1. AT模式(自动补偿)
- 原理:
- 一阶段:业务SQL执行时,Seata拦截SQL生成反向日志(UNDO_LOG),本地提交并释放锁。
1
2
3-- 示例:生成UNDO_LOG
INSERT INTO undo_log (branch_id, xid, rollback_info)
VALUES (?, ?, '{"after":{"stock":95},"before":{"stock":100}}') - 二阶段:
- 成功 → TC异步删除UNDO_LOG
- 失败 → TC根据UNDO_LOG自动生成反向SQL回滚(如
UPDATE stock SET count=100 WHERE id=1)
- 一阶段:业务SQL执行时,Seata拦截SQL生成反向日志(UNDO_LOG),本地提交并释放锁。
- 优势:无代码侵入,SQL自动解析补偿。
2. TCC模式(手动补偿)
- 流程:
1
2
3
4graph LR
A[Try: 冻结库存] --> B{全部成功?}
B -->|Yes| C[Confirm: 扣减真实库存]
B -->|No| D[Cancel: 释放冻结库存] - 场景:需细粒度资源控制的场景(如秒杀冻结库存)。
3. Saga模式(长事务补偿)
- 原理:将事务拆分为多个本地子事务,失败时按序执行补偿操作(如:订单创建→支付→发货,失败则触发退款→取消订单)。
✉️ 二、RocketMQ事务消息(核心:消息驱动最终一致)
运作流程
1 | sequenceDiagram |
- 容错机制:
- 生产者宕机 → Broker通过回查线程(默认30秒/次)确认事务状态。
- 消费端需幂等设计:通过唯一业务ID(如订单号)避免重复处理。
🔗 三、XA/JTA(核心:数据库协议层强一致)
2PC执行流程
- Prepare阶段:
- TM向所有RM发送PREPARE命令,各数据库写入Redo Log并锁定资源。
- Commit阶段:
- 所有RM返回YES → TM广播COMMIT,释放锁。
- 任一RM返回NO → TM广播ROLLBACK。
- 缺点:同步阻塞(事务期间资源锁定)、协调者单点故障风险。
🧩 四、选型建议(根据场景决策)
- 强一致性要求(如金融转账)→ XA模式(牺牲性能保一致)
- 高并发异步场景(如电商下单)→ RocketMQ事务消息(吞吐量>10万TPS)
- 微服务混合操作(涉及多个DB/服务)→ Seata AT/TCC(无侵入/灵活补偿)
- 长周期事务(如跨境物流)→ Seata Saga(分段提交+逆向补偿)
生产经验:
- Seata AT模式在阿里云支撑日均亿级订单,RocketMQ事务消息在双11峰值达百万级消息/秒。
- 避免“过度设计”:非核心业务可用最大努力通知(简单重试+告警)。
