Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Distribution 三阶段提交_Distribution_Distributed_Distributed Transactions - Fatal编程技术网

Distribution 三阶段提交

Distribution 三阶段提交,distribution,distributed,distributed-transactions,Distribution,Distributed,Distributed Transactions,我知道三阶段提交是为了解决“两阶段提交”的问题,在第二阶段,协调器和队列同时失败,无法知道协调器是否已决定提交消息 显然,三阶段提交的目的是通过添加一个额外的阶段来解决这个问题。但是在第三阶段,如果协调者和队列失败,您不会面临完全相同的问题吗?在3PC中,可以通过查询剩余的活动队列来找出失败的协调者决策。若任何活动队列处于预提交状态—这意味着所有队列都同意提交(否则协调员就不会发送预提交)。我们需要把其余的人都交出来,因为失败的人可能已经犯了罪 如果没有一个队列处于预提交状态-我们可以假设协调器

我知道三阶段提交是为了解决“两阶段提交”的问题,在第二阶段,协调器和队列同时失败,无法知道协调器是否已决定提交消息


显然,三阶段提交的目的是通过添加一个额外的阶段来解决这个问题。但是在第三阶段,如果协调者和队列失败,您不会面临完全相同的问题吗?

在3PC中,可以通过查询剩余的活动队列来找出失败的协调者决策。若任何活动队列处于预提交状态—这意味着所有队列都同意提交(否则协调员就不会发送预提交)。我们需要把其余的人都交出来,因为失败的人可能已经犯了罪

如果没有一个队列处于预提交状态-我们可以假设协调器没有向任何队列发送“提交”,因此没有发生副作用,我们可以中止

这里有一个很好的解释:

对于后人,以下是wikipedia如何定义3阶段提交:这是本文的要点:3阶段提交协议通过引入准备提交状态消除了这个问题。如果协调器在发送预提交消息之前失败,队列将一致同意操作已中止。在所有队列成员确认他们准备提交之前,协调员不会发送doCommit消息。这消除了任何队列成员在所有队列成员意识到执行soI的决定之前实际完成事务的可能性。我只是不知道添加额外阶段如何帮助解决问题“如果任何活动队列处于预提交状态-这意味着他们都同意提交(否则协调器就不会发送预提交)。我们需要提交其余的队列,因为失败的队列可能已经提交了。”但如果协调器从未收到失败队列的“是”(在协调器发送预提交后,由于延迟),该怎么办并发送了一个中止,失败队列收到了该中止,中止了事务,然后失败了?