2pc和3pc区别
2pc和3pc区别
3pc背景:
2pc协议在协调者和执行者同时宕机时(协调者和执行者不同时宕机时,都能确定事务状态),选出协调者之后 无法确定事务状态,会等待宕机者恢复才会继续执行(无法利用定时器来做超时处理,超时后也不知道事务状态,无法处理,强制处理会导致数据不一致),这段时间这个事务是阻塞的,其占用的资源不会被释放。为了解决这个问题,产生了3PC协议。
原理:
3PC增加了一个中间状态,方便判断事务状态,新的协调者不用等宕机者恢复 就能决定事务状态,准确的提交事务或者终止事务。
1.CanCommit(能否提交)
2.PreCommit(预提交)
进入这个状态,说明各执行节点的状态都是canCommit
3.doCommit(预提交)
进入这个状态,说明个执行节点的状态都是precommit
新协调者如果发现有的存活节点的状态是preCommit或doCommit,说明各执行节点的状态肯定都是"可以提交",协调者直接提交事务,能保证数据一致性 。
如果发现有的存活节点状态是abort状态,说明事务被中断了,协调者继续中断事务就行。
如果发现所有节点都是canCommit,说明各执行节点不会有处于doCommit状态(因为如果有节点是canCommit,不会有节点是canCommit状态),协调者中断事务,能保证数据一致性。
结论:
3pc解决了事务状态不可知的问题。不过其对执行者引入超时机制(超时后根据执行器当前状态canCommit or preCommit回滚或者提交事务,释放事务占用的资源),如果发生网络分区,会导致事务数据不一致,虽然提升了系统可用性,不过牺牲了系统一致性,执行者超时这个设计不好。
2pc 3pc归根到底是选择系统可用性还是选择系统一致性(CAP理论中的抉择问题)
2pc 一致性好、可用性较低,3pc 一致性较低、可用性高