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 一致性较低、可用性高

posted @   高压锅里的大萝卜  阅读(6907)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示