面试题答案
一键面试两阶段提交(2PC)
- 工作原理:
- 准备阶段(投票阶段):协调者向所有参与者发送事务内容,询问是否可以提交事务。参与者执行事务操作,但不提交,记录undo和redo日志,然后向协调者反馈是否准备好提交。
- 提交阶段(执行阶段):如果所有参与者都反馈准备好提交,协调者发送提交指令,参与者正式提交事务;如果有任何一个参与者反馈不能提交,协调者发送回滚指令,参与者回滚事务。
- 优势:
- 简单易懂:实现逻辑相对清晰,在很多场景下能较好保证数据一致性。
- 广泛应用:是一种较为经典的分布式事务处理方式,被很多数据库和中间件采用。
- 局限性:
- 单点故障:协调者一旦出现故障,整个分布式事务无法继续进行,可能导致事务长时间悬而不决。
- 同步阻塞:在准备阶段到提交阶段,参与者一直处于阻塞状态,资源被占用,影响系统并发性能。
- 数据不一致风险:在提交阶段,如果协调者发送的指令部分参与者未收到,可能导致部分提交,部分回滚,出现数据不一致。
三阶段提交(3PC)
- 工作原理:
- CanCommit阶段:协调者向参与者询问是否可以开始事务操作,参与者根据自身状态回复是否可以。
- PreCommit阶段:若所有参与者都回复可以,协调者向参与者发送预提交指令,参与者执行事务操作,记录日志,但不提交。然后向协调者反馈是否预提交成功。
- DoCommit阶段:如果所有参与者预提交成功,协调者发送提交指令,参与者正式提交事务;若有参与者预提交失败,协调者发送回滚指令,参与者回滚事务。
- 优势:
- 减少单点故障影响:引入了预提交阶段,在协调者故障恢复后,可根据预提交状态继续执行事务,一定程度减少了事务悬而不决的时间。
- 降低同步阻塞:相比2PC,在CanCommit阶段参与者可以正常处理其他请求,减少了阻塞时间,提高系统并发性能。
- 局限性:
- 依然存在不一致风险:虽然概率降低,但在网络分区等极端情况下,还是可能出现数据不一致。
- 实现复杂:相比2PC,增加了一个阶段,实现和维护成本更高。
TCC(Try - Confirm - Cancel)
- 工作原理:
- Try阶段:主要是对业务系统做检测及资源预留,不做真正的业务操作。例如在转账场景中,冻结账户金额。
- Confirm阶段:在Try成功后,执行真正的业务操作,如转账场景中,完成账户间资金转移。
- Cancel阶段:若Try成功但Confirm失败,执行回滚操作,如解冻之前冻结的金额。
- 优势:
- 性能较好:不需要长时间锁定资源,允许并发执行,提高系统性能。
- 灵活性高:业务开发人员可根据具体业务逻辑实现Try、Confirm和Cancel操作,适合复杂业务场景。
- 局限性:
- 开发成本高:每个业务操作都需要实现Try、Confirm和Cancel三个接口,对开发人员要求较高。
- 数据一致性依赖业务实现:如果Cancel实现不当,或者在Confirm和Cancel之间出现网络问题,可能导致数据不一致。