两阶段提交协议
两阶段提交协议
准备阶段:协调者向参与者发起指令,参与者评估自己的状态, 如果参与者评估指令可以完成,则会写redo或者undo日志(Write-Ahead Log的一种),然后锁定资源,执行操作,但是并不提交。
提交阶段:如果每个参与者明确返回准备成功,也就是预留资源 和执行操作成功,则协调者向参与者发起提交指令,参与者提交资源变 更的事务,释放锁定的资源;如果任何一个参与者明确返回准备失败, 也就是预留资源或者执行操作失败,则协调者向参与者发起中止指令, 参与者取消已经变更的事务,执行undo日志,释放锁定的资源。
我们看到两阶段提交协议在准备阶段锁定资源,这是一个重量级的 操作,能保证强一致性,但是实现起来复杂、成本较高、不够灵活,更 重要的是它有如下致命的问题。
阻塞:从上面的描述来看,对于任何一次指令都必须收到明确的 响应,才会继续进行下一步,否则处于阻塞状态,占用的资源被一直锁定,不会被释放
单点故障:如果协调者宕机,参与者没有协调者指挥,则会一直 阻塞,尽管可以通过选举新的协调者替代原有协调者,但是如果协调者 在发送一个提交指令后宕机,而提交指令仅仅被一个参与者接收,并且 参与者接收后也宕机,则新上任的协调者无法处理这种情况。 脑裂:协调者发送提交指令,有的参与者接收到并执行了事务, 有的参与者没有接收到事务就没有执行事务,多个参与者之间是不一致 的。 上面的所有问题虽然很少发生,但都需要人工干预处理,没有自动 化的解决方案,因此两阶段提交协议在正常情况下能保证系统的强一致 性,但是在出现异常的情况下,当前处理的操作处于错误状态,需要管 理员人工干预解决,因此可用性不够好,这也符合CAP协议的一致性和 可用性不能兼得的原理。
本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/14679676.html