2

想象一下,您在不同的系统上有 2 个实体,需要执行某种事务,根据与其中一个或两个实体相关联的信息更改其中一个或两个,并要求对两个实体的更改要么完成,要么都不完成.

简单的例子,基本上必须在 2 个单独的硬件上运行 2 行:

my_bank.my_account -= payment
their_bank.their_account += payment

大概有专门针对这种情况存在的算法或习语,在其他尝试访问相同值的情况下正常工作(对于正确的一些可预测的定义)。两阶段提交协议似乎就是这样一种方法。有没有更简单的替代方案,也许有更多的限制?(例如。也许他们要求没有系统可以完全关闭或无法响应。)或者也许有更复杂的系统在某些方面更好?是否有关于此事的标准或广受好评的文本?

4

1 回答 1

5

还有 3PC“ 3 Phase Commit Protocol ”。3PC 通过一个称为预提交的额外阶段解决了 2PC 的一些问题。事务中的参与者接收到一个预提交消息,以知道所有其他参与者都已同意提交,但尚未完成。当所有参与者都在等待来自协调器的提交或中止消息时,此阶段消除了 2PC 的不确定性。

AFAIK - 大多数数据库在 2PC 协议下工作得很好,因为在不太可能失败的情况下,它们总是有事务日志来撤消/重做操作并使数据保持一致状态。

大多数这些东西在

“数据库解决方案,第二版”

“数据库系统:全书”

更多在分布式世界中,您可能想要检查关于分布式事务和工作流的 Web 服务技术的当前状态。老实说,不是我的那杯茶。有 Python、Java 和 .Net 的框架来运行这种服务(一个例子)。

作为我去年的项目,几年前,我在 Web 服务之上实现了一个分布式 2PC 协议,并且我能够在两个独立的数据库上运行事务,就像您给出的示例一样。但是,我相信今天人们以一种最宁静的方式来实现这一点,例如看这里。尽管在这些链接中提到了一些其他协议,但最终它们都最终实现了 2PC。

总而言之,2PC 协议实现与适当的操作日志以在崩溃的情况下撤消/重做是最明智的选择之一。

于 2011-03-22T10:44:45.057 回答