6

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

+0

您是何时以及何时发生了这种错误?我认为在第一阶段会发生这样的错误,导致回滚。 – Oded

+0

您的意思是预先提交阶段的定义是每个人实际上完全执行了它们的事务部分,并且通过简单地将“”写入日志来定义提交阶段,但临界点是事务中没有实际执行在提交阶段?我所遇到的两阶段提交的所有文章从未完全清楚地指出每个数据库何时执行它们的事务部分 – user782220

+1

那么,实际发生的是实现特定的。但是,是的,这几乎就是发生了什么(发生了变化,分布式数据库正在等待的唯一情况是协调器为了通过提交来“结束交易”)。 – Oded

回答

4

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

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

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

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