三阶段提交(3PC)
三阶段提交是相对于两阶段提交而言的一种改进。它通过引入一个准备确认(Prepared/CanCommit)状态来解决两个问题:单点故障和长时间运行时性能下降。
与两阶段提交类似,三阶段提交也由一个协调者和多个参与者组成。但是,在第二个“准备”步骤之后,它引入了一个新的“预写日志”机制,并在最终“决策”步骤中使用该日志来处理可能发生的超时或失败情况。
三个关键步骤
步骤一:CanCommit - 准备确认
- 协调者向所有参与者发送准备请求。
- 参与者执行本地验证并返回结果给协调者。
- 如果所有参与者都成功,则进入下一步;否则回滚整个事务。
步骤二:PreCommit - 预写日志
- 协调者生成一个唯一的全局事务ID,并将该ID和操作类型(commit/rollback)记录在预写日志中。
- 协调者向所有参与者发送预提交请求。
- 参与者接收到请求后,会进行实际的数据修改或准备工作,并将其结果记录在本地日志中。
步骤三:DoCommit - 决策
- 协调者根据参与者的响应情况做出最终决策。
- 如果所有参与者都已经成功预提交,则协调者发送确认提交请求给所有参与者,完成整个事务。
- 如果任何一个参与者失败或超时,则协调者发送回滚请求给所有参与者,取消整个事务。