题目
解释两阶段提交协议(2PC)的基本原理
信息
- 类型:问答
- 难度:⭐
考点
分布式事务概念,两阶段提交协议,协调者角色
快速回答
两阶段提交协议(2PC)是分布式事务的核心解决方案,通过两个阶段确保多个服务的数据一致性:
- 准备阶段:协调者询问所有参与者是否能提交事务,参与者锁定资源并回复准备就绪(Yes)或失败(No)
- 提交阶段:若所有参与者回复Yes,协调者发送提交指令;若任一参与者回复No,则发送回滚指令
关键角色:
- 协调者:事务决策中心
- 参与者:执行具体事务的服务/数据库
解析
1. 原理说明
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是学习分布式事务的基础。