题目
简述分布式事务中两阶段提交(2PC)协议的基本原理
信息
- 类型:问答
- 难度:⭐
考点
分布式事务,两阶段提交(2PC),一致性协议
快速回答
两阶段提交(2PC)是分布式系统中保证事务一致性的协议,分为两个阶段:
- 准备阶段:协调者询问所有参与者能否提交事务
- 提交阶段:根据参与者反馈决定提交或回滚事务
核心目标:确保所有节点要么全部提交成功,要么全部回滚。
解析
原理说明
两阶段提交(2PC)通过协调者(Coordinator)管理多个参与者(Participants)的事务状态:
1. 准备阶段:协调者向所有参与者发送prepare请求,参与者执行事务但不提交,锁定资源并回复YES/NO。
2. 提交阶段:若所有参与者回复YES,协调者发送commit命令;若任一参与者回复NO或超时,则发送rollback命令。
代码示例(伪代码)
// 协调者逻辑
function twoPhaseCommit() {
// 阶段1:准备阶段
boolean allAgreed = true;
for (Participant p : participants) {
if (!p.prepare()) { // 参与者准备事务
allAgreed = false;
break;
}
}
// 阶段2:提交/回滚
if (allAgreed) {
for (Participant p : participants) p.commit(); // 全部提交
} else {
for (Participant p : participants) p.rollback(); // 任一失败则回滚
}
}
// 参与者逻辑
class Participant {
boolean prepare() {
try {
executeTransaction(); // 执行但不提交
return true; // 返回YES
} catch (Exception e) {
return false; // 返回NO
}
}
}最佳实践
- 超时机制:为每个阶段设置超时时间,避免无限等待
- 日志记录:协调者和参与者需记录状态日志,故障后能恢复
- 参与者数量控制:参与者过多会降低性能,建议≤5个
常见错误
- 协调者单点故障:协调者宕机导致参与者阻塞(需引入超时和选举机制)
- 网络分区问题:部分参与者收不到指令(需人工干预)
- 资源长期锁定:准备阶段后资源被锁定,影响系统并发性
扩展知识
- 三阶段提交(3PC):增加
CanCommit阶段解决2PC阻塞问题,但复杂度更高 - 适用场景:2PC适合数据库跨节点事务(如MySQL XA),不适合高并发场景
- 替代方案:TCC(Try-Confirm-Cancel)、Saga模式适用于微服务架构