两阶段提交协议(2PC)
两阶段提交协议用于保证分布式事务的原子性,即所有的参与节点或者全部都执行或者全部不执行,其执行过程主要分为两个阶段:
第一阶段,准备阶段;第二阶段,提交阶段。
1、准备阶段
协调者为每个参与者都发送prepare消息,每个参与者进行表决,返回同意或取消。预执行本地事务,资源阻塞,但不提交事务。
2、提交阶段
协调者基于每个参与者准备阶段的表决,当且仅当所有参与者同意提交,协调者才通知所有的参与者提交事务,否则协调者将通知所有的参与者取消事务。
三阶段提交协议(3PC)
三阶段提交协议在协调者和参与者中都引入超时机制,并且把两阶段提交协议的第一个阶段拆分成了两步:询问,然后再锁资源,最后真正提交。
(1)三个阶段的执行
1.CanCommit阶段
协调者向参与者发送CanCommit请求,参与者如果可以提交就返回Yes响应,否则返回No响应。
2.PreCommit阶段
协调者根据参与者的反应情况来决定是否可以继续事务的PreCommit操作。
3.DoCommit阶段
协调者基于每个参与者PreCommit阶段的反馈结果,决定真正提交事务,还是中断事务。
2PC与3PC对比
2PC | 3PC | |
超时 | 协调者可设置超时 | 协调者、参与者均可设置超时 |
阻塞 | 进入询问后阻塞所有节点 | 第一阶段缓冲,通过后第二阶段才阻塞 |
一致性 | 节点异常会发生不一致性 | 节点异常会发生不一致性 |