分布式事务的2pc方式以及3pc方式

本文介绍了分布式事务的两种常见协议:2PC(两阶段提交)和3PC(三阶段提交)。2PC在准备阶段和提交阶段进行操作,可能导致长时间锁定资源,影响性能。3PC则通过增加预提交阶段和超时机制,减少了单点故障和阻塞问题,参与者在超时后会默认执行提交。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2PC:即2 phase committee,包括准备阶段和提交阶段。这种方法把分布式事务设置为事务参与方(业务方),和事务管理方(协调方)。
(1)准备阶段: 事务协调者(事务管理器)给每个参与者(资源管理器)发送Prepare消息,每个参与者要么直接返回失败(如权限验证失败),要么在本地执行事务,写本地的redo和undo日志,但不提交。
(2)提交阶段:如果协调者收到了参与者的失败消息,或者超时,直接给每个参与者发送回滚(Rollback)消息;否则,发送提交(Commit)消息;参与者根据协调者的指令执行提交或者回滚操作,释放所有事务处理过程中使用的锁资源。(注意:必须在最后阶段释放锁资源)。
2pc提交,锁会从准备阶段一直持有,到最后阶段完成,才会释放锁。因此在分布式的环境下,性能并不是很好
在这里插入图片描述

3PC:三阶段提交协议,3 phase committee。 与两阶段提交不同的是,三阶段提交有两个改动点。 引入超时机制。同时在协调者和参与者中都引入超时机制。

cancommit阶段:和2PC的准备阶段很像。协调者向参与者发送commit请求,参与者如果可以提交就返回Yes响应,否则返回No响应。

1.事务询问 协调者向参与者发送CanCommit请求。询问是否可以执行事务提交操作。然后开始等待参与者的响应。
2.响应反馈 参与者接到CanCommit请求之后,正常情况下,如果其自身认为可以顺利执行事务,则返回Yes响应,并进入预备状态。否则反馈No。注意:只是进入事务预备状态

preparecommit阶段:协调者根据参与者的反应情况来决定是否可以执行事务的PreCommit操作。

1.发送预提交请求 协调者向参与者发送PreCommit请求,并进入Prepared阶段。
2.事务预提交 参与者接收到PreCommit请求后
### 两阶段提交(2PC)和三阶段提交(3PC)的原理及差异 #### 两阶段提交(Two-Phase Commit, 2PC) 两阶段提交是一种经典的分布式事务协议,主要用于协调多个参与者之间的事务提交过程。其核心思想是将整个事务分为两个阶段完成: 1. **准备阶段(Prepare Phase)** 协调者向所有参与者发送`prepare`请求,询问它们是否能够执行事务操作并准备好提交。如果某个参与者无法满足条件,则返回拒绝响应。只有当所有参与者都成功完成准备工作时,才能进入下一阶段[^1]。 2. **提交阶段(Commit Phase)** 如果所有参与者的`prepare`请求均得到确认,协调者会广播`commit`消息通知各节点正式提交事务;反之,若有任意一个节点失败,则由协调者发出`rollback`指令撤销已有的更改。 尽管2PC能有效保障原子性和一致性,但它存在一些显著缺陷: - 高度依赖于协调者的可用性; - 参与方长时间处于锁定状态等待最终决定,可能导致性能瓶颈; - 当网络分区发生时容易陷入阻塞状况。 #### 三阶段提交(Three-Phase Commit, 3PC) 为解决2PC存在的部分局限性,提出了改进版——三阶段提交机制。相比前者增加了额外的状态转换环节以减少不确定性风险。 1. **CanCommit阶段** 在这一初始步骤里,协调员仅需简单问询成员们是否有能力继续推进后续动作即可。一旦收到全体肯定答复便转入下一步骤;否则即刻终止流程发起回滚命令[^2]。 2. **PreCommit阶段** 此处进一步强化了预备工作力度,在确保资源预留无误之后再告知各方做好实际交付前的一切必要安排。值得注意的是即使在此期间遭遇突发情况也能依据先前记录迅速恢复原状而不至于完全丧失控制权[^2]。 3. **DoCommit阶段** 最终落实具体行动之前还有最后一步核查验证程序,旨在最大限度规避因通讯延迟等因素引发的数据不同步现象。倘若一切正常就下达确切指示让各个单元同步施行预定计划;要是发现异常则及时采取补救措施防止错误扩散蔓延开来。 通过引入中间过渡期以及增强容错能力的设计思路,3PC相对降低了死锁概率同时也提升了系统的鲁棒特性表现水平。不过与此同时它依旧保留着一定复杂程度的操作规程并且对于时间敏感型应用场景来说或许并非最佳选项之一。 ```python class TwoPhaseCommit: def prepare(self): pass def commit(self): pass def rollback(self): pass class ThreePhaseCommit(TwoPhaseCommit): def can_commit(self): pass def pre_commit(self): pass def do_commit(self): pass ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值