两阶段提交协议

两阶段提交协议

准备阶段:协调者向参与者发起指令,参与者评估自己的状态, 如果参与者评估指令可以完成,则会写redo或者undo日志(Write-Ahead Log的一种),然后锁定资源,执行操作,但是并不提交。

提交阶段:如果每个参与者明确返回准备成功,也就是预留资源 和执行操作成功,则协调者向参与者发起提交指令,参与者提交资源变 更的事务,释放锁定的资源;如果任何一个参与者明确返回准备失败, 也就是预留资源或者执行操作失败,则协调者向参与者发起中止指令, 参与者取消已经变更的事务,执行undo日志,释放锁定的资源。

我们看到两阶段提交协议在准备阶段锁定资源,这是一个重量级的 操作,能保证强一致性,但是实现起来复杂、成本较高、不够灵活,更 重要的是它有如下致命的问题。

阻塞:从上面的描述来看,对于任何一次指令都必须收到明确的 响应,才会继续进行下一步,否则处于阻塞状态,占用的资源被一直锁定,不会被释放

单点故障:如果协调者宕机,参与者没有协调者指挥,则会一直 阻塞,尽管可以通过选举新的协调者替代原有协调者,但是如果协调者 在发送一个提交指令后宕机,而提交指令仅仅被一个参与者接收,并且 参与者接收后也宕机,则新上任的协调者无法处理这种情况。  脑裂:协调者发送提交指令,有的参与者接收到并执行了事务, 有的参与者没有接收到事务就没有执行事务,多个参与者之间是不一致 的。 上面的所有问题虽然很少发生,但都需要人工干预处理,没有自动 化的解决方案,因此两阶段提交协议在正常情况下能保证系统的强一致 性,但是在出现异常的情况下,当前处理的操作处于错误状态,需要管 理员人工干预解决,因此可用性不够好,这也符合CAP协议的一致性和 可用性不能兼得的原理。

 

posted @   delphi中间件  阅读(147)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示