【一致性协议01】 2PC

Two-Phase Commit,二阶段提交,作为最基础的一致性协议,保证了分布式系统数据的一致性.目前绝大多数的关系型数据库都是使用2PC来完成分布式事务处理的.
利用2PC协议能够非常方便地完成所有数据库事务参与者的协调,统一决定事务的提交或回滚,从而能有效地保证分布式数据一致性.

优点

原理简单,实现方便

缺点

  • 同步阻塞

    极大的限制了系统的性能

  • 单点问题

    协调者在整个二阶段提交过程中,一旦出现故障(尤其是在阶段二),都会导致系统无法正常运行

  • 脑裂

    也就是数据不一致
    在阶段二,即执行事务提交的阶段,当协调者向所有参与者发送commit请求之后,发生了局域网络异常或者是协调者在尚未发送完commit请求之前自身崩溃,导致只有部分的参与者接收到了commit请求,这部分参与者就会进行事务的提交,没有收到commit的参与者则无法进行事务的提交。于是,整个分布式系统出现数据不一致的情况。

流程:

阶段1: 提交事务请求(投票阶段):

  1. 事务询问.

    协调者向所有的参与者发送事务内容,询问是否可以执行事务提交操作,并开始等待各参与者的响应.

  2. 执行事务.

    各参与者节点执行事务操作,并将UndoRedo信息记入事务日志.

  3. 各参与者向协调者反馈事务询问的响应

    如果参与者成功执行了事务操作,那么就反馈给协调者Yes信息,表示事务可以执行; 如果参与者没有成功执行事务就反馈给协调者No响应,表示事务不可以执行.

这个阶段可以看成一种投票阶段,即各个参与者投票表明是否要继续执行接下去的事务提交操作.

阶段2: 执行事务提交
这个阶段,协调者会根据参与者的反馈情况来决定是否最终进行commit.一般,包含两种可能:

#1 执行事务提交:
  1. 发送提交请求

    假如协调者从所有的参与者获得的反馈都是YES,那么就执行提交操作,协调者向参与者发送commit请求

  2. 事务提交

    参与者接受到Commit请求后,会正式执行事务提交操作,并在完成后释放整个事务执行期间所占用的资源

  3. 反馈事务提交结果

    参与者在完成事务提交之后,向协调者发送Ack信息

  4. 完成事务

    协调者收到所有参与者的Ack消息后,完成事务

#2 中断事务:

如果任何一个参与者返回了No信息,或者等待超时之后,协调者尚无法接受到所有的参与者反馈信息,就会中断事务。

  1. 发送回滚请求

    协调者向所有参与者发出Rollback请求

  2. 事务回滚

    参与者接收到Rollback请求后,会利用其在阶段一种记录的Undo信息来执行回滚操作,并在完成回滚之后释放在整个事务执行期间占用的资源。

  3. 反馈事务回滚结果

    参与者在完成事务回滚之后,向协调者发送Ack消息

  4. 中断事务

    协调者收到所有参与者反馈的Ack消息之后,完成事务中断