面试题答案
一键面试两阶段提交协议(2PC)
- 第一阶段:准备阶段
- 协调者向所有参与者发送事务预提交请求,并等待所有参与者的响应。
- 参与者收到请求后,执行事务操作,但不提交事务,而是记录undo和redo日志,然后向协调者反馈事务操作是否成功。
- 第二阶段:提交阶段
- 如果所有参与者在准备阶段都返回成功响应,协调者向所有参与者发送提交请求。参与者收到提交请求后,正式提交事务,并释放资源。
- 如果有任何一个参与者在准备阶段返回失败响应,协调者向所有参与者发送回滚请求。参与者收到回滚请求后,根据undo日志回滚事务,并释放资源。
三阶段提交协议(3PC)
- 第一阶段:CanCommit阶段
- 协调者向参与者发送CanCommit请求,询问是否可以执行事务操作。
- 参与者检查自身状态,如资源是否足够等,如果可以执行,返回Yes响应;否则返回No响应。
- 第二阶段:PreCommit阶段
- 如果所有参与者在CanCommit阶段都返回Yes响应,协调者向参与者发送PreCommit请求,参与者收到请求后,执行事务操作,但不提交事务,记录undo和redo日志,并向协调者反馈事务操作是否成功。
- 如果有任何一个参与者在CanCommit阶段返回No响应,协调者向所有参与者发送Abort请求,参与者收到请求后,不执行事务,直接释放资源。
- 第三阶段:DoCommit阶段
- 如果所有参与者在PreCommit阶段都返回成功响应,协调者向所有参与者发送DoCommit请求,参与者收到请求后,正式提交事务,并释放资源。
- 如果在PreCommit阶段有参与者返回失败响应,或者协调者在等待参与者响应超时时,协调者向所有参与者发送Abort请求,参与者收到请求后,根据undo日志回滚事务,并释放资源。
TCC(Try - Confirm - Cancel)
- Try阶段
- 业务系统根据自身逻辑对资源进行检测和预留操作。例如,在一个涉及账户转账的分布式事务中,转出账户Try阶段检查余额是否足够,并冻结相应金额;转入账户Try阶段可以检查账户是否正常等。此阶段主要是对业务资源进行初步处理和检查,不涉及最终的事务提交。
- Confirm阶段
- 如果所有参与方的Try阶段都成功,那么进入Confirm阶段。在这个阶段,业务系统对Try阶段预留的资源进行最终确认操作,完成真正的业务事务。如转出账户正式扣除冻结金额,转入账户增加相应金额。
- Cancel阶段
- 如果Try阶段有任何一方失败,或者在后续处理过程中出现问题,那么进入Cancel阶段。参与方需要对Try阶段的操作进行回滚,释放预留的资源。例如转出账户解冻之前冻结的金额。