1. 3PC是什么
2. 3PC流程
- 把2PC中的第一阶段拆分成两步,因此整个事务过程分成3个阶段:CanCommit、PreCommit、DoCommit
- CanCommit阶段:协调者向所有参与者询问你们是否可以完成本次事务?,各个参与者检查下自身状态的健康性,看有没有能力进行事务操作,然后向协调者返回ack消息。
- PreCommit阶段:
- 预提交事务:如果所有的参与者都返回yes的话,那么协调者向参与者发送sql,参与者本地执行事务,然后向协调者返回ack消息(注意这里参与者并没有提交事务)
- 中断事务:如果有参与者节点返回no或者协调者在等待参与者节点反馈的过程中超时,协调者就会向所有的参与者发送中断请求
- DoCommit阶段:
- 提交事务:如果PreCommit阶段所有参与者返回yes,那么协调者向参与者发送事务commit请求,让每个参与者commit本地事务;
- 回滚事务:其他情况协调者向参与者发送事务rollback请求
3. 2PC vs 3PC
- 把2PC中的第一阶段拆分成两步,因此整个事务过程分成3个阶段:CanCommit、PreCommit、DoCommit
- 同时引入了超时机制:协调者和参与者中都引入超时机制
- 解决单点故障问题+性能问题:因为一旦参与者无法及时收到来自协调者的信息之后,他会默认执行commit,而不会一直持有事务资源并处于阻塞状态
4. 3PC的使用场景
- 适用于强一致性、时间敏感度高、分布式事务可以回滚的业务的处理结果,比如金融转账场景
- 单个服务多个数据源且数据源都是DB,即传统单体
5. 3PC的问题
- 一致性问题:比如在进入PreCommit阶段后,如果协调者发送的是abort指令,而此时由于网络问题,有部分参与者在等待超时后仍未收到Abort指令的话,那这些参与者就会执行commit,这样就产生了不同参与者之间数据不一致的问题
- 实现困难
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除 |