概述
3PC 利用超时机制解决了 2PC 同步阻塞问题,避免资源被永久锁定,进一步加强了整个事务过程可靠性。但 3PC 同样无法应对类似宕机问题,只不过出现多数据源中数据不一致问题概率更小。
a. 概念:三阶段提交协议在协调者和参与者中都引入超时机制,并且把两阶段提交协议的第⼀个阶段拆分成了两步:询问,然后再锁资源,最后真正提交。这样三阶段提交就有CanCommit、PreCommit、DoCommit三个阶段。
三阶段提交(3PC)是二阶段提交(2PC)的一种改进版本,旨在解决2PC的一些问题,如阻塞和单点故障。3PC将二阶段提交的过程分为三个阶段:CanCommit、PreCommit和DoCommit,并引入超时机制。
工作流程
○ 准备阶段:协调者询问所有参与者是否可以执行事务提交。与2PC不同,这里的询问不是投票,而是询问是否可以安全地提交事务。参与者根据自身情况返回Yes或No。
○ 预提交阶段:如果所有参与者都返回Yes,协调者会向它们发送预提交请求。参与者执行事务操作,并将Undo和Redo日志写入本机事务日志。然后,它们发送Ack响应给协调者,等待最终的Commit或Abort指令。如果有参与者返回No或等待超时,协调者会发送中断请求,导致事务中断。
○ 提交阶段:如果协调者收到了所有参与者的Ack响应,它会从预提交状态转换到提交状态,并向所有参与者发送doCommit请求。参与者收到doCommit请求后,正式执行事务提交操作,并在完成后释放资源。协调者接收到所有参与者的Ack消息后,完成事务。

1.CanCommit 阶段:
○ 协调者向所有参与者发送CanCommit请求,并等待参与者的回复。
○ 参与者接收到CanCommit请求后,首先执行本地事务的预检查,检查是否存在任何可能导致事务无法提交的问题。
○ 如果参与者的预检查通过,它会发送Ack消息给协调者,表示可以提交事务。
○ 如果参与者的预检查失败,它会发送Abort消息给协调者,表示无法提交事务。
2.PreCommit 阶段:
○ 协调者收到所有参与者的Ack消息后,如果没有收到任何Abort消息,则发送PreCommit请求给所有参与者。
○ 参与者接收到PreCommit请求后,会再次执行本地事务的准备操作,并将undo和redo信息记录到日志中以便回滚或提交。
○ 如果参与者准备就绪,它会发送Ack消息给协调者。
○ 如果参与者在准备阶段遇到问题,它会发送Abort消息给协调者。
3.DoCommit 阶段:
○ 协调者在收到所有参与者的Ack消息后,如果没有收到任何Abort消息,则发送DoCommit请求给所有参与者。
○ 参与者接收到DoCommit请求后,执行事务的最终提交操作,并释放相关资源。
○ 事务提交完成后,参与者向协调者发送Ack消息,表示事务已提交。
如果在任何阶段发生超时或接收到Abort消息,协调者会中止事务并发送Abort请求给所有参与者,参与者接收到Abort请求后执行事务的回滚操作。
三阶段提交相对于二阶段提交的改进之处在于引入了超时机制,在CanCommit和PreCommit阶段都设置了超时时间。这样可以避免一些常见的问题,如网络故障、崩溃节点等导致的阻塞情况。然而,三阶段提交仍然存在一些问题,如脑裂和数据不一致的风险,因此在实际应用中需要根据具体场景进行权衡和选择。
需要注意的是,上述只是对三阶段提交的基本原理和流程进行了简要解释,实际应用中还需要考虑更多的细节和异常情况处理,以确保分布式事务的正确执行。
优缺点
优点:3PC有效降低了2PC带来的参与者阻塞范围,并且能够在出现单点故障后继续达成一致。
缺点:然而,3PC也带来了新的问题。在参与者收到preCommi

本文介绍了3PC协议,一种改进的分布式事务提交方法,通过三阶段(CanCommit、PreCommit和DoCommit)降低2PC的阻塞,并处理单点故障。然而,它增加了数据不一致风险。文章还提供了简单的Java代码示例以说明实现原理。
最低0.47元/天 解锁文章
621

被折叠的 条评论
为什么被折叠?



