图解分布式事务之二阶段提交、三阶段提交

2022/04/17 Algorithm Distributed System 共 1215 字,约 4 分钟
amagcatdog

分布式事务一般包含一个协调者和多个参与者,目标是在协调者的组织下,保证参与者要么都执行了某个事务,要么都没有执行事务,同时参与者本身执行事务需要保证事务的 ACID 特性。

业界常用的分布式事务算法包括二阶段提交(2PC)和三阶段提交(3PC)两种,下面分别用时序图的方式讨论不同情况下的分布式事务处理逻辑。

2PC

二阶段提交的两个阶段:

  1. 准备阶段(Prepare):协调者询问参与者是否可以正常执行事务,参与者执行事务,但不提交
  2. 提交阶段(Commit):协调者通知参与者进行提交,参与者受到后提交事务

下面分别讨论各种可能的情况。

  • 二阶段提交正常流程,存在问题是参与者执行事务后,可能会锁定事务相关临界资源,访问这些资源将会同步阻塞:

    二阶段提交正常流程

    参与者返回拒绝

  • 异常情况1,协调者准备阶段发出报文后单点故障,协调者无法发送提交报文,参与者执行事务后等待提交事务,进入长期阻塞状态:

    协调者单点故障,参与者长期阻塞

  • 异常情况2,协调者发出的提交报文部分参与者没有收到,或者协调者发提交报文过程中异常,导致部分参与者没有收到提交报文,收到提交报文的参与将会提交事务,系统将会不一致:

    参与者不一致

总结,二阶段提交可能存在如下几个问题:

  • 性能问题:参与者执行事务后,临界资源阻塞无法访问
  • 可靠性问题:协调者异常未发送提交报文,参与者长期阻塞
  • 数据一致性问题:部分参与者没有收到提交报文,系统不一致

3PC

三阶段提交在二阶段提交基础上加入了超时和预提交阶段,缓解了二阶段提交中的阻塞和不一致问题。

三阶段提交流程:

  1. 准备阶段(Can-Commit):协调者询问各参与者是否能执行事务,不发送任何事务内容,只是确保参与者都运行正常。协调者接收确认报文超时或收到拒绝则取消事务,否则进入阶段2
  2. 预提交阶段(Pre-Commit):协调者发送预提交请求,参与者接收到请求后执行事务操作,并将 Undo 和 Redo 信息记录到事务日志中,同时锁定当前记录。如果协调者收到确认报文超时或者收到拒绝报文则回滚取消事务,否则进入阶段3
  3. 提交阶段(Do-Commit):协调者发送提交请求,参与者收到后进行事务提交,如果超时没收到提交请求,参与者将自动提交事务

三阶段提交的时序图:

三阶段提交时序图

总结,三阶段提交解决和未解决的问题:

  • 性能问题:相对二阶段提交,通过准备阶段确保网络畅通、参与者正常,可以减少二阶段提交中的参与者阻塞问题(比如某个参与者异常了,二阶段的话会导致其它参与者执行事务后进入阻塞状态,只有等到协调者接收超时取消事务才能解除阻塞。而三阶段提交可以预先发现参与者异常,从而不再进行事务准备,减少了不必要的阻塞)。但是三阶段提交的预提交和提交阶段之间,参与者还是会阻塞的
  • 可靠性问题:提交阶段如果协调者异常未发送提交报文,参与者等待超时后将自动提交事务,不会造成长期阻塞
  • 数据一致性问题:部分参与者没有收到提交报文,等待超时后将自动提交事务,不会造成系统数据长期不一致的问题,但超时时间内,接收到提交报文的参与者和未接收到提交报文的参与者之间,可能存在数据不一致的问题

文档信息

Search

    Table of Contents