2PC和3PC是分布式事务中的概念。
2PC
- 投票阶段,唯一的协调执行并发起提案,其余的参与者执行提案,并回复协调者执行结果,这一阶段协调者和参与者都没有提交提案。
- 执行阶段,如果所有参与者通过,则协调者执行提案并向所有参与者发送Commit消息,参与者收到Commit消息后执行提案。如果有参与者不通过,则协调者回滚提案,并向所有参与者发送Rollback消息,参与者收到Rollback消息后中止提案。
缺点
- 同步阻塞,全局提交前,协调者和参与者会锁住相应资源(可以为协调者引入超时机制来解决)。
- 单点故障,协调者故障,会导致其余参与者阻塞,即使有选主机制也无法规避这个问题,因为新的协调者诞生后无法继续之前的提案(可以把协调者单点变集群来解决)。
- 数据不一致,可能部分参与者未收到Commit消息(无法解决)。
3PC
- CanCommit,如果参与者可以获取相应资源的锁,则同意,否则不同意。
- PreCommit,如果CanCommit阶段所有参与者通过,则进入PreCommit阶段,和2PC的投票阶段一样,区别在于3PC中为协调者和参与者引入了超时机制。
- DoCommit,如果PreCommit阶段所有参与者通过,则进入DoCommit阶段,和2PC的执行阶段一样。
CanCommit的作用主要是为了提高PreCommit的通过率,而为参与者引入超时则是为了进一步缓解同步阻塞问题,但3PC依旧是无法解决数据不一致问题的。