两阶段提交

概念

角色

协调者:事务管理器

参与者:资源管理器(分布式集群中的节点)

第一阶段:提交请求阶段

  1. 协调者节点向所有参与者节点询问是否可以执行提交操作,并开始等待各参与者节点的响应。
  2. 参与者节点执行询问发起为止的所有事务操作,并将Undo信息和Redo信息写入日志。
  3. 各参与者节点返回协调者节点发起询问的响应。如果参与者节点的事务操作实际执行成功,则它返回一个”同意”消息;如果参与者节点的事务操作实际执行失败,则它返回一个”中止”消息。

第二阶段:提交执行阶段

如果协调者从所有参与者节点获得的相应消息都为”同意”,则向所有参与者节点发出”正式提交”的请求,否则发出”回滚操作”的请求。参与者根据协调者的指令执行提交或者回滚操作,释放所有事务处理过程中使用的锁资源。

(1) 当协调者节点从所有参与者节点获得的相应消息都为”同意”时(成功):

  1. 协调者节点向所有参与者节点发出”正式提交”的请求。
  2. 参与者节点正式完成操作,并释放在整个事务期间内占用的资源。
  3. 参与者节点向协调者节点发送”完成”消息。
  4. 协调者节点收到所有参与者节点反馈的”完成”消息后,完成事务。

(2) 如果任一参与者节点在第一阶段返回的响应消息为”终止”,或者协调者节点在第一阶段的询问超时之前无法获取所有参与者节点的响应消息时(失败):

  1. 协调者节点向所有参与者节点发出”回滚操作”的请求。
  2. 参与者节点利用之前写入的Undo信息执行回滚,并释放在整个事务期间内占用的资源。
  3. 参与者节点向协调者节点发送”回滚完成”消息。
  4. 协调者节点收到所有参与者节点反馈的”回滚完成”消息后,取消事务。
协调者都必须在此阶段结束当前事务。

缺点

同步阻塞

在二阶段提交的过程中,所有的节点都在等待其他节点的响应,无法进行其他操作。

单点问题

协调者在整个二阶段提交过程中很重要,如果协调者在提交阶段出现问题,那么整个流程将无法运转。

数据不一致

如果网络断开,只有部分参与者收到了commit请求。这将导致数据不一致问题。