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