2PC,不是两个 PC 机的意思,而是 Two-Phase-Commit。可以认为是一种算法,也可以认为是一种协议,主要目的就是为了保证分布式系统数据的一致性
什么是 2PC
在分布式系统中,会有多个机器节点,因此需要一个 “协调者” ,而各个节点就是 “参与者”,协调者统一调度所有分布式节点的执行逻辑,这些被调度的分布式节点就是 “参与者”。
二阶段提交就是将事务的提交过程分成了两个阶段来进行处理。流程如下:
阶段一:事务请求阶段(投票阶段)
事务询问:协调者向所有的参与者询问,是否准备好了执行事务,并开始等待各参与者的响应
执行事务:各参与者节点执行事务操作,并将 Undo 和 Redo 信息记入事务日志中
事务响应:如果参与者成功执行了事务,那么就反馈给协调者 Yes 响应,表示事务可以执行;如果参与者没有成功执行事务,就返回 No 给协调者,表示事务不可以执行
从上面可以看出,这个所谓的 “投票阶段” 是用来判断是否所有的节点都可以执行事务操作
阶段二:事务提交阶段
在阶段二中,会根据阶段一的投票结果执行两种操作:执行事务提交,中断事务
执行事务提交步骤如下:
发送提交请求:协调者向所有参与者发出 commit 请求
事务提交:参与者收到 commit 请求后,会正式执行事务提交操作,并在完成提交之后释放整个事务执行期间占用的事务资源
反馈事务提交结果:参与者在完成事务提交之后,向协调者发送 ack 信息。协调者收到所有参与者反馈的 ack 信息后,完成事务
中断事务步骤如下:
发送回滚请求:协调者向所有参与者发出 RollBack 请求
事务回滚:参与者收到 RollBack 请求后,会利用其在阶段一中记录的 Undo 信息来执行事务回滚操作,并在完成回滚之后释放在整个事务执行期间占用的资源
反馈事务回滚结果:参与者在完成事务回滚之后,向协调者发送 ack 信息
中断事务:协调者接收到所有参与者反馈的 Ack 信息后,完成事务中断
优点缺点
优点:原理简单,实现方便
缺点:同步阻塞,单点问题,数据不一致,过于保守
同步阻塞
在二阶段提交的过程中,所有的节点都在等待其他节点的响应,无法进行其他操作。这种同步阻塞极大地限制了分布式系统的性能