三阶段提交
来自智得网
简介
两阶段存在阻塞问题和一致性问题。
- 阻塞
- 两阶段提交中协调者发起的准备指令和提交指令必须收到所有参与者的返回才能决定后续的状态,否则将持续处于阻塞状态,此时占用的资源会被一直锁定,长期占据的资源会对性能有较大的影响。
- 协调者在执行事务的过程中如果发生故障,则所有的参与者都会陷入阻塞等待后续指令。
- 不一致
- 协调者发送提交指令,部分参与者成功提交了事务,部分参与者未能接受提交指令,此时多个参与者的状态就出现了不一致的情况。
- 如果部分参与者在接收到提交指令之后发生宕机,而此时协调者也发生了宕机,后续选举出来的协调者的继任者无法确定所有参与者的状态,此时会出现故障。
三阶段针对两阶段存在的两个问题,阻塞和不一致问题给出了解决方案,其中,阻塞问题通过引入超时机制解决,不一致问题通过引入新的阶段预提交环节解决。
三阶段提交将分布式事务分成三个环节,准备阶段,预提交阶段,提交阶段。
原理
准备阶段
和两阶段提交类似,准备阶段的主要功能也是完成资源锁定以及数据写入等操作,准备阶段通过将锁等资源获取前置,减少后续提交阶段失败的可能性。
- 三阶段事务的准备阶段,协调者会对所有的参与者发起准备的指令。
- 参与者接收到准备指令之后,进行事务操作,本环节的事务操作一般包括资源锁定,记录回滚日志(Undolog),执行成功会给协调者发送成功的返回,否则返回失败。
- 协调者收到所有参与者的返回都是成功时,而阶段提交会进入提交阶段。
- 协调者如果收到部分参与者的返回是失败的时候,则将成功的参与者进行回滚。
预提交阶段
- 三阶段提交的预提交阶段会完成事务中剩余的操作。
- 如果在预提交阶段进行回滚,则会将准备阶段的数据进行恢复操作。
- 当协调者收到所有参与者成功的指令,预提交阶段提交结束。
提交阶段
- 提交阶段引入了超时机制,当协调者没有收到预提交阶段的全部响应,会发起提交。
- 提交阶段进行锁资源等释放动作。
三阶段的思想和两阶段基本一致,但是通过引入新的阶段,将提交动作做更细的拆解,减少事务提交失败的概率,所以可以引入超时机制以及默认的提交动作。