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

什么是TCC?什么是二阶段提交?三阶段提交?


在分布式系统中,TCC、**二阶段提交(2PC)三阶段提交(3PC)**是解决分布式事务一致性的核心协议。它们的核心目标是协调多个参与节点的事务操作,确保数据最终一致性。


1. 二阶段提交(2PC)

核心思想

通过协调者(Coordinator)分两个阶段协调所有参与者(Participants)的事务操作,保证所有节点要么全部提交,要么全部回滚。

执行流程
  1. 准备阶段(Prepare Phase)

    • 协调者向所有参与者发送 Prepare 请求,询问是否可以提交事务。
    • 参与者执行事务操作(但不提交),记录 Undo/Redo 日志,返回 Yes/No
  2. 提交阶段(Commit Phase)

    • 所有参与者返回 Yes → 协调者发送 Commit 命令,参与者正式提交事务。
    • 任一参与者返回 No → 协调者发送 Rollback 命令,参与者回滚事务。
特点与问题
  • 优点:强一致性保证,实现简单。
  • 缺点
    • 同步阻塞:参与者等待协调者指令时处于阻塞状态。
    • 单点故障:协调者宕机会导致参与者无限等待。
    • 数据不一致:协调者发送 Commit 后部分参与者宕机,可能导致部分提交。
适用场景
  • 传统数据库分布式事务(如 XA 协议)。
  • 对一致性要求高、参与者较少的场景。

2. 三阶段提交(3PC)

核心改进

在 2PC 的基础上增加 预提交阶段(Pre-Commit),并引入超时机制,降低阻塞风险。

执行流程
  1. CanCommit 阶段

    • 协调者询问参与者是否具备提交条件(资源是否充足)。
    • 参与者返回 Yes/No
  2. PreCommit 阶段

    • 所有参与者返回 Yes → 协调者发送 PreCommit,参与者锁定资源并返回 ACK。
    • 任一参与者返回 No → 协调者发送 Abort,参与者终止事务。
  3. DoCommit 阶段

    • 协调者发送最终 CommitRollback 指令。
    • 参与者超时未收到指令则默认提交(基于状态推测)。
特点与问题
  • 优点
    • 降低阻塞概率(超时自动提交/回滚)。
    • 减少单点故障影响。
  • 缺点
    • 网络分区时仍可能数据不一致。
    • 实现复杂,实际应用较少。
适用场景
  • 对可用性要求稍高,但仍需强一致性的系统。

3. TCC(Try-Confirm-Cancel)

核心思想

通过业务逻辑的 补偿机制 实现最终一致性,将事务拆分为三个阶段:

  1. Try:预留资源(如冻结库存)。
  2. Confirm:确认操作(如扣减库存)。
  3. Cancel:补偿回滚(如释放库存)。
执行流程
  1. Try 阶段

    • 调用所有参与者的 try() 接口,预留资源(如检查并冻结库存)。
    • 若所有参与者返回成功 → 进入 Confirm 阶段。
    • 任一参与者失败 → 进入 Cancel 阶段。
  2. Confirm/Cancel 阶段

    • Confirm:调用所有参与者的 confirm(),提交预留资源(如真实扣减库存)。
    • Cancel:调用所有参与者的 cancel(),释放预留资源(如解冻库存)。
特点与问题
  • 优点
    • 无全局锁,高并发性能好。
    • 支持异构系统(如混合数据库和 HTTP 服务)。
  • 缺点
    • 业务侵入性高:需为每个服务设计 Try/Confirm/Cancel 接口。
    • 需保证幂等性:网络重试可能导致重复调用,需业务层处理。
适用场景
  • 高并发业务(如电商秒杀、金融支付)。
  • 需最终一致性的长事务(如跨系统订单处理)。

对比总结

特性2PC3PCTCC
一致性强一致性强一致性最终一致性
性能低(阻塞等待)中(减少阻塞)高(无锁)
复杂度高(需业务改造)
容错能力差(单点故障)中(超时机制)高(补偿机制)
适用场景传统数据库事务改进型强一致性系统高并发、异构系统

实际案例

2PC 案例:XA 事务
-- MySQL XA 事务示例
XA START 'tx1';          -- 开启事务
UPDATE account SET balance = balance - 100 WHERE user_id = 1;
XA END 'tx1';
XA PREPARE 'tx1';        -- 准备阶段
XA COMMIT 'tx1';         -- 提交阶段
TCC 案例:电商下单
  1. Try 阶段
    • 订单服务:生成预订单(状态为“处理中”)。
    • 库存服务:冻结商品库存(如 freeze_stock 表)。
  2. Confirm 阶段
    • 订单服务:更新订单状态为“已支付”。
    • 库存服务:扣减真实库存。
  3. Cancel 阶段(若支付失败):
    • 订单服务:标记订单为“已取消”。
    • 库存服务:解冻库存。

选择建议

  • 强一致性需求 → 2PC(如银行转账)。
  • 高可用与最终一致性 → TCC(如电商秒杀)。
  • 需改进 2PC 的阻塞问题 → 3PC(较少使用,可结合消息队列优化)。

在这里插入图片描述

相关文章:

  • DeepSeek 入门:从注册到首轮对话全流程
  • 【深度学习-Day 7】精通Pandas:从Series、DataFrame入门到数据清洗实战
  • C语言——操作符
  • 快速上手SpringBoot开发指南
  • 电子商务商家运营简历模板
  • 操作指南*
  • allegro出gerber时,单击Artwork并没有弹窗的问题
  • Linux 安全加固
  • htop筛选进程时,出现重复进程
  • 浅谈C++的new和delete
  • 端口隔离实验
  • Docker容器网络架构深度解析与技术实践指南——基于Linux内核特性的企业级容器网络实现
  • 如何进行室内VR全景拍摄?
  • 控制mac地址表端口安全
  • 004 Linux基本指令
  • 使用 Selenium 截图功能,截不到原生 JavaScript 弹窗
  • Red Hat linux环境openssh升级到openssh-10.0p1
  • [特殊字符] Milvus + LLM大模型:打造智能电影知识库系统
  • 首屏加载时间优化策略
  • WSL 的 Ubuntu 子系统中启用图形化界面
  • 母亲节|写给妈妈
  • 人民日报读者点题·共同关注:今天我们为什么还需要图书馆?
  • 上财发布“AI+课程体系”,人工智能如何赋能财经教育?
  • 新修订的《婚姻登记条例》明起施行,领证不用户口本了
  • 上海国际电影节推出三大官方推荐单元,精选十部优秀影片
  • 七方面118项任务,2025年知识产权强国建设推进计划印发