两阶段提交协议(2PC:Two-Phase Commit)
两阶段提交协议的目标在于为分布式系统保证数据的一致性,许多分布式系统采用该协议提供对分布式事务的支持。顾名思义,该协议将一个分布式的事务过程拆分成两个阶段:投票和事务提交。为了让整个数据库集群能够正常的运行,该协议指定了一个协调者单点,用于协调整个数据库集群各节点的运行。为了简化描述,我们将数据库集群中的各个节点称为参与者,三阶段提交协议中同样包含协调者和参与者这两个角色定义。
第一阶段:投票
该阶段的主要目的在于打探数据库集群中的各个参与者是否能够正常的执行事务,具体步骤如下:
协调者向所有的参与者发送事务执行请求,并等待参与者反馈事务执行结果;事务参与者收到请求之后,执行事务但不提交,并记录事务日志;参与者将自己事务执行情况反馈给协调者,同时阻塞等待协调者的后续指令。
第二阶段:事务提交
在经过第一阶段协调者的询盘之后,各个参与者会回复自己事务的执行情况,这时候存在 3 种可能性:
所有的参与者都回复能够正常执行事务。一个或多个参与者回复事务执行失败。协调者等待超时。
对于第 1 种情况,协调者将向所有的参与者发出提交事务的通知,具体步骤如下:
协调者向各个参与者发送 commit 通知,请求提交事务;参与者收到事务提交通知之后执行 commit 操作,然后释放占有的资源;参与者向协调者返回事务 commit 结果信息。
对于第 2 和第 3 种情况,协调者均认为参与者无法成功执行事务,为了整个集群数据的一致性,所以要向各个参与者发送事务回滚通知,具体步骤如下:
协调者向各个参与者发送事务 rollback 通知,请求回滚事务;参与者收到事务回滚通知之后执行 rollback 操作,然后释放占有的资源;参与者向协调者返回事务 rollback 结果信息。
__两阶段提交协议解决的是分布式数据库数据强一致性问题__,实际应用中更多的是用来解决事务操作的原子性,下图描绘了协调者与参与者的状态转换。
站在协调者的角度,在发起投票之后就进入了 WAIT 状态,等待所有参与者回复各自事务执行状态,并在收到所有参与者的回复后决策下一步是发送 commit 或rollback 信息。站在参与者的角度,当回复完协调者的投票请求之后便进入 RE