二阶段提交协议和三阶段提交协议都是分布式系统数据一致性问题解决方案。同时,这2种方案也不是百分之百可靠的,虽然这么说,但是也能极大的提高了一致性。有效解决分布式一致性问题的是Paxos算法。
一、二阶段提交(two phase commit)
二阶段提交中的角色有一个协调者和多个分布式参与节点。
第一阶段:准备阶段,也有人叫投票阶段
第二阶段:提交阶段
当开始一个分布式事务时,协调者先向所有节点发出准备命令和要执行的任务,节点接收到任务后,直接进行预处理,通常是写redolog 和undolog等,预处理完成后给协调者响应。如果这个过程任意节点响应预处理失败,协调者将会对其他节点发出回滚命令,随后结束这个事务。如果这个过程所有节点响应预处理成功,就进入第二阶段,协调者将会给所有节点发送提交命令,完成分布式事务。
二阶段提交协议中没有约定超时时间,所以如果协调者在发起事物但还没结束这段时间内挂了,可能导致节点事务一致阻塞无法结束。另外,如果在第二阶段向所有节点发送的commit命令,也是可能部分发送成功,部分失败的,还是会导致数据不一致。
二、三阶段提交(three phase commit)
三阶段提交协议与二阶段提交协议一个重大的变化就是引入了超时机制,协调者和节点都引入了超时机制。另外新增了一个询问阶段。
第一阶段:canCommit
第二阶段:preCommit
第三阶段:doCommit
当开始一个分布式事务时,协调者先向所有节点发送canCommit问询,得到所有节点同意后才进入第二节点,这么做的好处就是能提前得知无法执行事务的节点,从而避免让其他节点过早的开始预处理,浪费资源,这个阶段其实是一个性能上的小优化。
当协调者得到所有节点canCommit同意响应后,就开始向所有节点发送preCommit命令,后面的流程和二阶段提交一致了。唯一的区别就是协调者在超时没有得到所有节点响应时,可以自动发送终止事务的命令。节点在迟迟没有收到协调者的后续指令也可以自动终止事务。