两阶段提交是否可以防止最终提交失败?

时间:2012-06-23 20:05:14

标签: database transactions distributed-transactions 2phase-commit

假设分布式事务中涉及的所有数据库都使用两阶段提交信号实现,它们已准备好提交并具有必要的锁定。协调器发出提交信号,所有数据库都执行它们的部分事务,但是一个SQL数据库由于编程监督而未能考虑这种可能性而遇到零除错误。由于协调员已经发信号通知每个人因为被零除的结果会发生什么?

1 个答案:

答案 0 :(得分:6)

第二个提交阶段通常不包含可能失败的用户代码。参与的资源管理者需要保证不会发生故障。如果违反此保证,协议不能提供任何保证。

两阶段提交尝试解决Two Generals Problem。这个问题没有完整的解决方案。 TPC是近似值。

TPC失败的另一种方式是网络分区。某些资源管理器可能会执行最终提交,但有些可能无法接收该消息。同样,这个问题是无法解决的。即使是重试也无法解决它。

您甚至可以在真实条件下触发此问题:在压力测试中运行所有参与节点,并在任意点拉动网络电缆。很可能您的分布式数据库现在不一致,因为一些提交消息丢失了非常不方便的时间。