当前位置: 首页 > news >正文

分布式事物

好的,分布式事务是分布式系统中的核心难点之一,XA、AT(Auto Transaction)和TCC(Try-Confirm-Cancel)是三种常见的解决方案。以下是它们的原理和流程对比:


一、 XA 事务(两阶段提交协议)

适用场景:传统数据库层的强一致性事务,依赖数据库原生支持(如MySQL XA协议)。

原理

两阶段提交(2PC)

  1. Prepare Phase(准备阶段)
    ◦ 事务管理器(TM)向所有参与者(资源管理器,RM)发送“预提交”请求。
    ◦ 参与者执行事务操作,记录undo/redo日志,锁定资源,返回“就绪”或“失败”。
  2. Commit Phase(提交阶段)
    ◦ 若所有参与者返回“就绪”,TM发送“提交”命令,参与者持久化数据并释放锁。
    ◦ 若任一参与者返回“失败”,TM发送“回滚”命令,参与者撤销操作。
流程示例
TM → RM1: Prepare
TM → RM2: Prepare
RM1 → TM: Ready
RM2 → TM: Ready
TM → RM1: Commit
TM → RM2: Commit
优缺点

优点:强一致性,数据库原生支持。
缺点
• 性能差(同步阻塞、锁竞争)。
• 单点故障(TM宕机可能导致资源长期锁定)。
• 不适用于高并发或长事务场景。


二、 AT 事务(自动补偿型)

适用场景:Seata框架提出的模式,适用于微服务架构,通过本地事务+全局锁实现弱侵入性。

原理

核心机制

  1. 全局锁:在业务表上记录全局锁,防止其他事务修改相同数据。
  2. 本地事务:每个分支事务提交时自动生成回滚日志(undo log)。
  3. 补偿机制:若事务失败,通过undo log回滚数据。
流程
  1. 阶段一(提交)
    • 业务SQL执行前,记录数据快照(undo log)。
    • 执行业务SQL,提交本地事务,释放本地锁(但保留全局锁)。
  2. 阶段二(提交/回滚)
    • 若全局事务成功,异步删除undo log。
    • 若全局事务失败,根据undo log生成反向SQL补偿数据。
优缺点

优点
• 无侵入性(仅需代理数据源)。
• 性能优于XA(无全局锁等待)。
缺点
• 全局锁可能引发脏写(需业务隔离级别支持)。
• 无法处理非SQL操作(如Redis、MQ)。


三、 TCC 事务(补偿型)

适用场景:需要业务高度可控的场景(如金融交易),通过业务代码实现补偿逻辑。

原理

三阶段模型

  1. Try 阶段:预留资源(如冻结账户余额),记录中间状态。
  2. Confirm 阶段:提交事务,确认资源操作(如扣减冻结金额)。
  3. Cancel 阶段:回滚事务,释放预留资源(如解冻金额)。
流程示例
订单服务 → Try: 创建订单(状态:待确认)
库存服务 → Try: 冻结库存(库存数-1,冻结数+1)

-- 若所有Try成功 --
订单服务 → Confirm: 订单状态改为“已确认”
库存服务 → Confirm: 冻结库存数-1,实际库存数不变

-- 若任一Try失败 --
订单服务 → Cancel: 删除订单
库存服务 → Cancel: 库存数+1,冻结数-1
关键要求

幂等性:Confirm/Cancel需支持重复调用。
防悬挂:需处理Try成功但未收到Confirm/Cancel的场景(如超时控制)。

优缺点

优点
• 灵活性高,可处理非SQL操作。
• 性能较好(无全局锁)。
缺点
• 业务侵入性强(需实现Try/Confirm/Cancel接口)。
• 开发复杂度高(需处理所有异常分支)。


四、 对比总结

方案一致性性能侵入性适用场景
XA强一致传统数据库事务
AT最终一致微服务+SQL场景
TCC最终一致金融等高可靠性业务

五、 选型建议

  1. XA:适合强一致性的简单事务(如跨库转账),但对性能要求不高。
  2. AT:适合微服务架构下的SQL操作(如电商下单),平衡性能与侵入性。
  3. TCC:适合复杂业务(如支付、库存扣减),需精细化控制补偿逻辑。

通过结合业务需求(一致性、性能、开发成本)选择合适方案,必要时可混合使用(如TCC+AT)。

相关文章:

  • JetBrains PhpStorm v2024.3.1 Mac PHP开发工具
  • jupyter异常及解决办法记录
  • 使用PyCharm安装和配置OpenCV的详细教程
  • Python高级爬虫之js逆向+安卓逆向1.3节:Python数据类型
  • Android MVVM架构实战:XML与Compose的Hilt+ViewModel整合开发
  • 思考力提升的黄金标准:广度、深度与速度的深度剖析
  • 【软考系统架构设计师】系统架构设计知识点
  • 5.11 GitHub API调试五大高频坑:从JSON异常到异步阻塞的实战避坑指南
  • oracle命令上下左右键无法使用如何解决?
  • vue工程中路由导致的循环依赖问题
  • 使用 IP 代理改 IP 后注意事项如何防封号
  • OpenCV 进阶实战与技巧——图像处理的全面解析
  • Spring MVC 获取请求头参数详解
  • 【HarmonyOS 5】敏感信息本地存储详解
  • 数据结构---B树
  • decompiled.class file bytecode version50(java 6)
  • 分页查询列表每页1000条的优化
  • day1 初识MySQL
  • 词袋模型和TF-IDF(数学公式推导、手动实现、调库使用、示例:使用词袋模型处理多个文档)详解
  • 【前端工程化】-【vue2-ele项目升级】
  • 山东莒县农商银行去年收入、利润下降,资本充足率等指标增长
  • “两高”出台司法解释,严打破坏黑土地资源犯罪
  • 山东滕州一车辆撞向公交站台致多人倒地,肇事者被控制,案件已移交刑警
  • “注胶肉”或已泛滥?这几种肉,再爱吃也要管住嘴
  • 罗志田:文学革命的社会功能与社会反响
  • 9米长林肯车开进安徽“皖南川藏线”致拥堵数小时,车主回应争议称配合调查