两阶段提交¶
概念¶
第一阶段:提交请求阶段¶
- 协调者节点向所有参与者节点询问是否可以执行提交操作,并开始等待各参与者节点的响应。
- 参与者节点执行询问发起为止的所有事务操作,并将Undo信息和Redo信息写入日志。
- 各参与者节点返回协调者节点发起询问的响应。如果参与者节点的事务操作实际执行成功,则它返回一个”同意”消息;如果参与者节点的事务操作实际执行失败,则它返回一个”中止”消息。
第二阶段:提交执行阶段¶
如果协调者从所有参与者节点获得的相应消息都为”同意”,则向所有参与者节点发出”正式提交”的请求,否则发出”回滚操作”的请求。参与者根据协调者的指令执行提交或者回滚操作,释放所有事务处理过程中使用的锁资源。
(1) 当协调者节点从所有参与者节点获得的相应消息都为”同意”时(成功):
- 协调者节点向所有参与者节点发出”正式提交”的请求。
- 参与者节点正式完成操作,并释放在整个事务期间内占用的资源。
- 参与者节点向协调者节点发送”完成”消息。
- 协调者节点收到所有参与者节点反馈的”完成”消息后,完成事务。
(2) 如果任一参与者节点在第一阶段返回的响应消息为”终止”,或者协调者节点在第一阶段的询问超时之前无法获取所有参与者节点的响应消息时(失败):
- 协调者节点向所有参与者节点发出”回滚操作”的请求。
- 参与者节点利用之前写入的Undo信息执行回滚,并释放在整个事务期间内占用的资源。
- 参与者节点向协调者节点发送”回滚完成”消息。
- 协调者节点收到所有参与者节点反馈的”回滚完成”消息后,取消事务。
协调者都必须在此阶段结束当前事务。