2PC/3PC

 

2PC

其实2pc也是一种分布式一致性算法,但是存在阻塞,单点问题,同时也有简单的优点

角色

参与者和协调者

执行分两段

  1. 提交事务请求 (propose)

协调者发送事务给所有参与者,询问所有参与者是否可以执行事务,参与者执行事务操作,undo redo写入日志,向协调者反馈结果

  1. 执行事务

所有参与者都同意执行,那么协调者发送正式提交请求,参与者正式提交事务,并向协调者发送ack

只要有一个参与者发送了失败,协调者向所有参与者发送回滚请求,参与者完成回滚之后在发送ack,事务完成

问题

同步阻塞

过程是同步的,会阻塞

单点

全程靠协调者,协调者如果挂了就没了

3PC

改进2pc,分三段,询问,然后再锁资源,最后真正提交

第一阶段:CanCommit

和2pc的第一阶段相似,询问所有参与者是否可以进行事务操作,参与者进行响应

第二阶段:PreCommit

参与者都是响应都是yes,进行预提交,否则中断事务

1.预提交

协调者发送precommit,参与者执行事务,写入undo redo日志 , 响应ack给协调者,等待最后的commit 或abort

2.中断事务

协调者发送abort, 参与者收到abort或者超时没有收到,都会中断事务

第三阶段:Do Commit

1.提交

协调者发送docommit , 参与者正式提交,响应给协调者,协调者收到所有响应yes,结束事务 这里如果没有收到协调者指令,参与者都会超时后默认提交

2.中断事务

协调者发送abort,参与者回滚,响应给协调者,结束事务

3pc增加超时机制,在提交前保证各个节点的状态一致,达到precommit状态之后,各个节点都倾向commit,否则倾向于放弃,如果发生网络分区,数据就不一致

2pc 一致性好、可用性较低,3pc 一致性较低、可用性高