【一致性协议02】 3PC

3PC是在2PC的基础上,将第二阶段的提交协议中“提交事务请求”过程一分为二,形成了由CanCommitPreCommitdo Commit三个阶段组成的事务处理协议。

阶段1: CanCommit

  1. 事务询问
  2. 各参与者向协调者反馈事务询问的相应

阶段2: PreCommit

在阶段2中,协调者会根据参与者的反馈情况来决定是否可以进行事务的PreCommit操作,正常情况下,包含两种可能:

  • 执行事务预提交

    假如协调者从所有参与者获得的反馈都是YES,就会执行事务的预提交

  1. 发送预提交请求
  2. 事务预提交
  3. 各参与者向协调者反馈事务执行的相应
  • 中断事务

    假如任何一个参与者向协调者反馈了NO响应,或者在等待超时之后,协调者尚无法接收到所有的参与者反馈,就会中断事务

  1. 发送中断请求:协调者发送abort请求
  2. 中断事务:无论是收到来自协调者的abort请求,或是在等待协调者请求过程中超时,参与者都会中断事务

阶段3: doCommit

进行真正的事务提交

  • 执行提交
  1. 发送提交请求: 协调者发送doCommit请求
  2. 事务提交
  3. 反馈事务提交结果
  4. 完成事务
  • 中断事务
  1. 发送中断请求
  2. 事务回滚:参与者在接收到abort请求后,会利用在第二个阶段记录的undo信息来执行事务回滚操作,并在回滚之后释放在整个事务执行期间占用的资源。
  3. 反馈事务回滚结果
  4. 中断事务

注意

阶段3可能会出现两种故障:

  • 协调者出现问题
  • 协调者和参与者之间网络出现问题
    无论那种情况,最终都会导致参与者无法及时收到来协调者的doCommit或是abort请求,参与者在等待超时后,会放弃此次事务再次进行新的事务提交。