二阶段提交协议(Two-phase commit protocol),简称 2PC。
两阶段提交是一种强一致性事务协议,它分为准备阶段和提交阶段。
在准备阶段,协调者节点询问所有参与者是否准备好提交事务,如果所有参与者都答应准备好了,那么在提交阶段,协调者会通知所有参与者提交事务。
如果有任何一个参与者在准备阶段没有准备好,那么协调者会通知所有参与者回滚事务。
有熟悉 MySQL 的同学可能马上想到了,MySQL 的事务提交就是通过几种日志来实现二阶段提交的。
优点
- 原子性保证:2PC 协议可以保证所有参与者要么全部提交成功,要么全部失败回滚,从而实现跨多个分布式节点的事务的原子性。
- 简单直观:2PC 的设计思路简单,逻辑清晰,容易理解,这使得它在很多传统的数据库和分布式系统中得到了广泛的应用,比如 MySQL 从 5.5 版本开始支持。
缺点
- 同步阻塞:在 2PC 的第一阶段,所有参与者在响应协调者的准备请求后,必须等待最终的提交或回滚指令。这期间,所有参与者都处于阻塞状态,无法进行其他操作,导致资源锁定时间较长,在高并发场景下很明显不太适用。
- 单点故障:如果协调者在第二阶段崩溃,参与者可能会无限期地等待指令,因为它们不知道应该提交还是回滚。这使得整个系统容易受到单点故障的影响。
- 数据不一致:如果在第二阶段中协调者向某些参与者发送了提交指令,而其他参与者因为网络问题没有收到指令,那么这些没有收到指令的参与者可能会选择回滚,导致数据不一致。
- 复杂的恢复机制:当系统崩溃后,恢复过程非常复杂,所有参与者必须保持足够的信息以便在系统恢复后能够继续完成 2PC 协议。
© 版权声明
本站文章由不念博客原创,未经允许严禁转载!
THE END