侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

解释两阶段提交协议(2PC)的基本原理

2025-12-14 / 0 评论 / 4 阅读

题目

解释两阶段提交协议(2PC)的基本原理

信息

  • 类型:问答
  • 难度:⭐

考点

分布式事务概念,两阶段提交协议,协调者角色

快速回答

两阶段提交协议(2PC)是分布式事务的核心解决方案,通过两个阶段确保多个服务的数据一致性:

  1. 准备阶段:协调者询问所有参与者是否能提交事务,参与者锁定资源并回复准备就绪(Yes)或失败(No)
  2. 提交阶段:若所有参与者回复Yes,协调者发送提交指令;若任一参与者回复No,则发送回滚指令

关键角色:

  • 协调者:事务决策中心
  • 参与者:执行具体事务的服务/数据库

解析

1. 原理说明

2PC通过强一致性保证跨服务事务的原子性:
2PC流程图
(图示:协调者与参与者的交互流程)

  • 阶段一:准备(Prepare)
    • 协调者向所有参与者发送PREPARE请求
    • 参与者执行事务操作(不提交),锁定资源,写入undo/redo日志
    • 返回YES(就绪)或NO(失败)
  • 阶段二:提交/回滚(Commit/Rollback)
    • 若所有参与者返回YES:协调者发送COMMIT,参与者提交事务并释放锁
    • 若任一参与者返回NO:协调者发送ROLLBACK,参与者回滚事务

2. 代码示例(伪代码)

// 协调者逻辑
function executeTransaction() {
  // 阶段1:准备
  List<Response> responses = participants.map(p -> p.prepare());

  // 阶段2:决策
  if (responses.allMatch(res -> res == YES)) {
    participants.forEach(p -> p.commit());  // 全部提交
  } else {
    participants.forEach(p -> p.rollback()); // 任一失败则回滚
  }
}

// 参与者逻辑(例如订单服务)
function prepare() {
  try {
    lockOrderTable();      // 锁定资源
    writeTransactionLog(); // 写日志
    return YES;            // 确认就绪
  } catch (Exception e) {
    return NO;             // 执行失败
  }
}

3. 最佳实践

  • 超时机制:参与者等待协调者指令超时时,主动查询状态避免永久阻塞
  • 日志持久化:协调者和参与者必须记录操作日志,故障恢复后继续流程
  • 补偿事务:结合Saga模式处理长事务,减少资源锁定时间

4. 常见错误

  • 单点故障:协调者宕机导致参与者永久阻塞 → 解决方案:引入协调者集群
  • 数据不一致:网络分区时部分参与者提交、部分回滚 → 解决方案:人工干预或最终一致性补偿
  • 性能瓶颈:同步阻塞降低系统吞吐量 → 解决方案:改用TCC或消息队列方案

5. 扩展知识

方案特点适用场景
2PC强一致性,实现简单短事务、低并发场景
TCC性能高,需业务实现补偿高并发、长事务
Saga最终一致性,无锁跨服务业务流程

💡 面试进阶提示:实际开发中更常用最终一致性方案(如Seata框架),但理解2PC是学习分布式事务的基础。