问题:
一个事务操作需要跨越多个分布式节点的时候,为了保持事务处理的acid特性,需要有一个协调者的组件来统一调度所有的分布式节点的执行逻辑。这个协调者需要做两项工作,一是负责协调参与者的行为,二是最终决定参与者是否要把最终的事务进行真正的提交,基于这个思想,衍生出二阶提交和三阶提交两种协议。
2PC
第一阶段:提交事务请求(投票阶段)
- 将事务内容发送给参与者,并询问是否可以进行事务提交
- 参与者执行事务,将执行内容计入事务日志
- 参与者向协调者返回执行结果
第二阶段:执行事务提交
因为第一阶段会产生两种结果,执行成功,或者执行失败,所以这个阶段包含两种可能。
执行事务提交:
- 发送提交请求
- 事务提交
- 反馈事务处理结果
- 完成事务
中断事务:
- 发起回滚请求
- 事务回滚
- 反馈事务回滚结果
- 中断事务
3PC
3pc是在2pc的基础上进行了改进,提出了三段提交协议
阶段一:CanCommit
- 事务询问,询问是否可以执行事务提交操作,等待参与者的反应
- 事务的参与者向协调者进行相应,反馈yes,进入预备状态,否则反馈no
阶段二:PreCommit
由于阶段一同样会有两种结果,所以此阶段包含两种可能
执行事务预