三阶段提交¶
概念¶
- 第一阶段:CanCommit:询问
- 第二阶段:PreCommit:锁定资源
- 第三阶段:Do Commit:提交
区别¶
- 引入超时机制:同时在协调者和参与者中都引入超时机制。
- 在第一阶段和第二阶段中插入一个准备阶段,保证了在最后提交阶段之前各参与节点的状态是一致的。
第一阶段¶
- 协调者向参与者发送CanCommit请求。询问是否可以执行事务提交操作。然后开始等待参与者的响应。
- 参与者如果其自身认为可以顺利执行事务,则返回Yes响应,并进入预备状态;否则反馈No。
第二阶段¶
执行事务预提交¶
- 协调者向所有参与者节点发出 preCommit 的请求,并进入 prepared 状态。
- 参与者执行事务操作,(2PC 准备阶段中的 “执行事务”),把Undo 和 Redo 信息记录到事务日志中。
- 如果参与者成功执行了事务,就反馈 ACK 响应,同时等待指令:提交(commit) 或终止(abort)。
中断事务¶
- 协调者向所有参与者节点发出 abort 请求 。
- 参与者如果收到 abort 请求或者超时了,都会中断事务。
第三阶段¶
执行提交¶
- 协调者接收到各参与者发送的ACK响应,从预提交状态进入到提交状态。并向所有参与者发送 doCommit 请求。
- 参与者接收到 doCommit 请求之后,执行正式的事务提交。并在完成事务提交之后释放所有事务资源。
- 事务提交完之后,向协调者发送 ACK 响应。
- 协调者接收到所有参与者的 ACK 响应之后,完成事务。
中断提交¶
- 协调者向所有参与者发送 abort 请求。
- 参与者接收到 abort 请求之后,利用其在阶段二记录的 undo 信息来执行事务的回滚操作,并在完成回滚之后释放所有的事务资源。
- 参与者完成事务回滚之后,向协调者发送 ACK 消息。
- 协调者接收到参与者反馈的 ACK 消息之后,完成事务的中断。