谁能告诉我,为什么协调器失败时 2PC 会阻塞?是不是因为 2PC 中的队列没有使用超时概念?
问问题
1571 次
2 回答
1
两阶段是阻塞协议,因为当参与者进入准备阶段时,他们必须等待协调者决定下一步处理的内容。当协调器失败时,他们必须等到它复活。不可能启动另一个协调器来达到结果。参与者在被命令之前不得改变他们的状态。
我可以理解您将 3PC 与 2PC 进行比较。因此 3PC 协议(据我所知)是一个协议家族,其中很少存在。3PC 解决了 2PC 的阻塞性问题。要点是仅在了解“环境”的情况下始终如一地完成事务(提交或回滚)。预计会启动一个新的协调器(备份)(可能从参与者中选择)并且可以完成事务。有办法包括超时以在一段时间后中止参与者。即使新启动的协调器应该能够始终如一地完成整个事务(在这种情况下可能通过回滚)。
于 2017-06-19T23:39:13.440 回答
0
当 Coordinator 失败时,2PC 并不总是阻塞,使用 2PC 的系统只会在 Coordinator 失败时阻塞,只要有人读出准备好的(不确定的)资源。
如果给 Participant 的提交消息(阶段 2)丢失,则 Participant 的资源保持在准备状态,它必须参考 Coordinator 来检查资源的确切状态。参与者无法确定准备好的资源本身的确切状态。
于 2020-12-08T11:49:01.670 回答