二阶段提交协议(2PC)
二阶段提交协议是计算机网络中,尤其是在数据库领域内,为了使基于分布式系统架构下的所有节点在进行事务处理过程中能够保持原子性和一致性的一种算法。目前,绝大部分的关系型数据库都是采用二阶段提交协议来完成分布式事务处理的。
协议说明
阶段一:提交事务请求
- 事务询问
协调者询问参与者是否可以执行事务提交的操作,并开始等待参与者的响应 - 执行事务
各参与者执行事务操作,并将Undo和Redo信息记入事务日记 - 参与者反馈响应
参与成功执行事务返回Yes响应,反之返回No,表示事务是否可以被执行
阶段一也被称为”投票阶段“,即各参与者表明是否要继续执行事务提交操作。
阶段二:执行事务提交
若所有的参与者均反馈Yes,那么开始进行事务的提交
- 发送提交请求
协调者向参与者发送Commit请求 - 事务提交
每个参与者进行事务的提交 - 反馈事务提交结果
参与者完成事务提交后,返回Ack消息 - 完成事务
协调者收到所有参与的Ack消息,完成整个事务
若在所有参与者有一个返回No响应,或者等待超时,那么协调者会中断事务
- 发送回滚请求
协调者向所有参与者发送Rollback请求 - 事务回滚
参与者利用阶段一的Undo信息来执行回滚操作 - 反馈回滚操作
参与者在完成回滚操作后,返回Ack消息 - 中断事务
协调者接受到所有参与者反馈的Ack消息后,完成整个事务的中断
二阶段提交将一个事务的处理过程分为投票和执行两个阶段,其核心是每个参与者先进行事务操作,再全票通过之后进行事务的提交。二阶段提交协议可以看作是一个强一致性算法。
二阶段协议的优缺点
优点:原理简单、实现方便
缺点:同步阻塞、单点问题、脑裂和太过保守
同步阻塞
二阶段协议最大的的问题,会极大限制分布式系统的性能。二阶段提交过程中,参与者与协调者处于同步阻塞状态。单点问题
一旦协调者出现故障问题,其他参与者会一直处于锁定事务资源的状态中,而无法继续完成事务操作。数据不一致
在阶段二执行事务提交的过程,当协调者向发出Commit之后,发生了局部网络异常或者发送给一部分参与者之后就崩溃,导致只有部分参与者接收到Commit请求,并执行,最终会造成整个分布式系统出现数据不一致性现象。太过保守
二阶段提交协议没有完善的容错机制,任意一个节点的失败都会导致整个事务的失败。