三阶段提交

概念

  • 第一阶段:CanCommit:询问
  • 第二阶段:PreCommit:锁定资源
  • 第三阶段:Do Commit:提交

区别

  • 引入超时机制:同时在协调者和参与者中都引入超时机制。
  • 在第一阶段和第二阶段中插入一个准备阶段,保证了在最后提交阶段之前各参与节点的状态是一致的。

第一阶段

  1. 协调者向参与者发送CanCommit请求。询问是否可以执行事务提交操作。然后开始等待参与者的响应。
  2. 参与者如果其自身认为可以顺利执行事务,则返回Yes响应,并进入预备状态;否则反馈No。

第二阶段

执行事务预提交

  1. 协调者向所有参与者节点发出 preCommit 的请求,并进入 prepared 状态。
  2. 参与者执行事务操作,(2PC 准备阶段中的 “执行事务”),把Undo 和 Redo 信息记录到事务日志中。
  3. 如果参与者成功执行了事务,就反馈 ACK 响应,同时等待指令:提交(commit) 或终止(abort)。

中断事务

  1. 协调者向所有参与者节点发出 abort 请求 。
  2. 参与者如果收到 abort 请求或者超时了,都会中断事务。

第三阶段

执行提交

  1. 协调者接收到各参与者发送的ACK响应,从预提交状态进入到提交状态。并向所有参与者发送 doCommit 请求。
  2. 参与者接收到 doCommit 请求之后,执行正式的事务提交。并在完成事务提交之后释放所有事务资源。
  3. 事务提交完之后,向协调者发送 ACK 响应。
  4. 协调者接收到所有参与者的 ACK 响应之后,完成事务。

中断提交

  1. 协调者向所有参与者发送 abort 请求。
  2. 参与者接收到 abort 请求之后,利用其在阶段二记录的 undo 信息来执行事务的回滚操作,并在完成回滚之后释放所有的事务资源。
  3. 参与者完成事务回滚之后,向协调者发送 ACK 消息。
  4. 协调者接收到参与者反馈的 ACK 消息之后,完成事务的中断。