MST
星途 面试题库

面试题:Java分布式系统中,常用的保证事务一致性的协议有哪些,简述其原理

在Java分布式系统中,为了确保事务一致性,会使用一些特定的协议。请列举至少两种常用协议,并简要描述它们是如何保证事务一致性的工作原理。
10.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

两阶段提交协议(2PC)

  1. 第一阶段:准备阶段
    • 协调者向所有参与者发送事务预提交请求,并等待所有参与者的响应。
    • 参与者收到请求后,执行事务操作,但不提交事务,而是记录undo和redo日志,然后向协调者反馈事务操作是否成功。
  2. 第二阶段:提交阶段
    • 如果所有参与者在准备阶段都返回成功响应,协调者向所有参与者发送提交请求。参与者收到提交请求后,正式提交事务,并释放资源。
    • 如果有任何一个参与者在准备阶段返回失败响应,协调者向所有参与者发送回滚请求。参与者收到回滚请求后,根据undo日志回滚事务,并释放资源。

三阶段提交协议(3PC)

  1. 第一阶段:CanCommit阶段
    • 协调者向参与者发送CanCommit请求,询问是否可以执行事务操作。
    • 参与者检查自身状态,如资源是否足够等,如果可以执行,返回Yes响应;否则返回No响应。
  2. 第二阶段:PreCommit阶段
    • 如果所有参与者在CanCommit阶段都返回Yes响应,协调者向参与者发送PreCommit请求,参与者收到请求后,执行事务操作,但不提交事务,记录undo和redo日志,并向协调者反馈事务操作是否成功。
    • 如果有任何一个参与者在CanCommit阶段返回No响应,协调者向所有参与者发送Abort请求,参与者收到请求后,不执行事务,直接释放资源。
  3. 第三阶段:DoCommit阶段
    • 如果所有参与者在PreCommit阶段都返回成功响应,协调者向所有参与者发送DoCommit请求,参与者收到请求后,正式提交事务,并释放资源。
    • 如果在PreCommit阶段有参与者返回失败响应,或者协调者在等待参与者响应超时时,协调者向所有参与者发送Abort请求,参与者收到请求后,根据undo日志回滚事务,并释放资源。

TCC(Try - Confirm - Cancel)

  1. Try阶段
    • 业务系统根据自身逻辑对资源进行检测和预留操作。例如,在一个涉及账户转账的分布式事务中,转出账户Try阶段检查余额是否足够,并冻结相应金额;转入账户Try阶段可以检查账户是否正常等。此阶段主要是对业务资源进行初步处理和检查,不涉及最终的事务提交。
  2. Confirm阶段
    • 如果所有参与方的Try阶段都成功,那么进入Confirm阶段。在这个阶段,业务系统对Try阶段预留的资源进行最终确认操作,完成真正的业务事务。如转出账户正式扣除冻结金额,转入账户增加相应金额。
  3. Cancel阶段
    • 如果Try阶段有任何一方失败,或者在后续处理过程中出现问题,那么进入Cancel阶段。参与方需要对Try阶段的操作进行回滚,释放预留的资源。例如转出账户解冻之前冻结的金额。