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回滚或者提交事务,释放事务占用的资源),若是发生网络分区,会致使事务数据不一致,虽然提高了系统可用性,不过牺牲了系统一致性,执行者超时这个设计很差。
it
2pc 3pc归根究竟是选择系统可用性仍是选择系统一致性(CAP理论中的抉择问题)原理
2pc 一致性好、可用性较低,3pc 一致性较低、可用性高定时器