1. 两阶段提交(2PC)的阻塞问题,协调者故障导致参与者持锁悬挂?
请说明两阶段提交(2PC)的阻塞问题,以及协调者故障导致参与者持锁悬挂的原因?
- 2PC 的两阶段(prepare/commit)流程
- 协调者故障导致的阻塞
- 悬挂与锁持有
两阶段提交(2PC)分两阶段:准备阶段(prepare/vote),协调者向所有参与者发 prepare,参与者预留资源并返回准备结果;提交阶段(commit/abort),协调者收回所有确认后统一发 commit 或 abort。阻塞问题:若协调者在准备阶段后、提交阶段前发生故障,参与者已进入"准备完成"状态却拿不到最终指令,只能继续持有事务资源(锁、undo 日志)等待,形成"悬挂"(in-doubt)——参与者无法自行决定提交还是回滚,导致锁被长期占用、堵塞其他事务,系统进入不确定状态。这是 2PC 的固有缺陷:协调者单点故障会造成阻塞,且无法完全避免(需要协调者恢复或人工介入)。
2PC 强调"强一致",但以阻塞为代价。协调者故障时参与者处于"已准备、未决"状态,既不能提交也不能回滚,只能持锁等待。缓解方式:协调者做持久化与高可用、参与者提供 xa_recover 查询未决事务、人工或超时补偿,但都无法彻底消除阻塞窗口。