三阶段提交(Three-Phase Commit),也叫作三阶段提交协议(Three-Phase Commit Protocol),是二阶段提交(2PC)的改进版本。具体改进如下。
- 引入超时机制:在协调者和参与者中引入超时机制,如果协调者长时间接收不到参与者的反馈,则认为参与者执行失败。
- 在第1 阶段和第2 阶段都加入一个预准备阶段,以保证在最后的任务提交之前各参与节点的状态是一致的。也就是说,除了引入超时机制,三阶段提交协议(3PC)把两阶段提交协议(2PC)的准备阶段再次一分为二,这样三阶段提交就有CanCommit、PreCommit、DoCommit三个阶段。
1.CanCommit阶段
协调者向参与者发送Commit请求,参与者如果可以提交就返回Yes响应,否则返回No响应。
2.PreCommit阶段
协调者根据参与者的反应来决定是否继续进行,有以下两种可能。
- 假如协调者从所有参与者那里获得的反馈都是Yes响应,就预执行事务。
- 假如有任意参与者向协调者发送了No响应,或者在等待超时之后协调者都没有接收到参与者的响应,则执行事务的中断。
3.DoCommit阶段
该阶段进行真正的事务提交,主要包括:协调者发送提交请求,参与者提交事务,参与者响应反馈(在事务提交完之后向协调者发送Ack响应),协调者确定完成事务,如下图所示。