想象一下,您在不同的系统上有2个实体,并且需要根据与其中一个或两个相关联的信息执行某种更改其中一个或两个的事务,并要求对两个实体的更改都将完成,或者两者都不需要他们会的。
简单的例子,基本上必须在2个独立的硬件上运行2行:
my_bank.my_account -= payment
their_bank.their_account += payment
据推测,存在专门针对此类情况的算法或习惯用法,在存在其他尝试访问相同值的情况下正确工作(对于某些可预测的正确定义)。 two-phase commit protocol似乎是一种这样的方法。是否有更简单的替代方案,可能有更多限制? (例如,也许他们要求没有系统可以完全关闭或无法响应。)或者可能有更复杂的系统在某种程度上更好?关于此事,是否有标准或备受好评的文本?
答案 0 :(得分:5)
还有3PC“3 Phase Commit Protocol”。 3PC通过一个称为预提交的额外阶段解决了2PC的一些问题。事务中的参与者接收预提交消息以知道所有其他参与者已同意提交,但尚未完成。当所有参与者都在等待来自协调员的提交或中止消息时,此阶段消除了2PC的不确定性。
AFAIK - 大多数数据库在使用2PC协议时都能正常工作,因为在不太可能发生的情况下,它们总是有事务日志来撤消/重做操作并使数据保持一致状态。
中讨论了大部分内容
"Database Solutions, second edition"
和
"Database Systems: The Complete Book"
在分布式世界中,您可能希望在distributed transactions and workflows上检查Web服务技术的当前状态。说实话,不是我的一杯茶。有Python,Java和.Net的框架来运行这种服务(an example)。
作为我去年的项目,几年前,我在Web服务之上实现了分布式2PC协议,我能够在两个独立的数据库上运行事务,就像你给出的例子一样。但是,我相信今天人们以一种最宁静的方式实现这一点,例如see here。尽管这些链接中提到了一些其他协议,但最终它们都最终实现了2PC。
总之,在崩溃的情况下,使用正确的操作日志撤消/重做的2PC协议实现是最明智的选择之一。