第一个阶段:预提交阶段,也可以称之为投票阶段。在这个阶段,协调者询问所有的参与者是否已准备好提交事务,参与者通常都会给出一个“YES or NO”的回答,即我们认为的投票过程。根据事务的Atomic特性,但凡有一个参与者Say NO,那么协调者就认为这个事务提交是失败的。只有全部参与者给出“YES”的回答,才能让事务顺利提交。
第一个阶段:询问阶段。协调者询问每个参与者是否可以进行提交,这时候会出现多种情况。参与者明确自己是否能提交,可以给出“YES or NO”的准确回答,也有可能因为各种因素,导致不能确定,直到此次询问超时,返回“NO”。
第二个阶段:预提交阶段。根据上阶段得到的应答,协调者决定事务Commit or Abort,将投票最终结果发送给各个参与者,参与者收到此决定后再继续下面的操作,只不过到了此阶段,双方都有超时机制了。协调者也有可能因为各种原因不能及时做出决定,超时后就自动给出了Abort决定,与此同时,参与者收到了协调者的决定,需要回传ACK信息以确定,如果没有在规定的时间窗口内确认,协调者认为事务应该Abort。
第三个阶段:正式提交阶段。在上一个阶段,各个参与者已经收到了事务Commit or Abort的确认信息,其实这个阶段可以认为是一个二次确认阶段,协调者会发送一个DoCommit指令,参与者才真正开始进行事务的操作,并给协调者回复一个ACK。如果此时协调者接收ACK超时,协调者也会Abort整个事务。值得注意的是,如果协调者本身发送DoCommit就超时了,参与者也不会直接Abort事务,而是按照第二个阶段的结果执行。