假设您在不同的系统上有两个实体,并且需要执行某种事务,该事务基于与其中一个或两个实体关联的信息更改其中一个或两个实体,并且要求对两个实体的更改要么完成,要么两者都不完成。
简单的例子,实际上必须在两个独立的硬件上运行两行:
my_bank.my_account -= payment
their_bank.their_account += payment
大概有算法或成语专门针对这种情况存在,在其他尝试访问相同值的情况下正确工作(对于某些可预测的正确定义)。two-phase commit protocol似乎就是这样一种方法。有没有更简单的选择,也许有更多的限制?(也许他们要求没有一个系统可以完全关闭或无法响应)或者也许有更复杂的系统在某些方面更好?在这件事上,有没有一个标准的或公认的文本?
最佳答案
还有3PC“3 Phase Commit Protocol”。3pc通过一个称为pre-commit的额外阶段解决了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协议,并且我能够在两个独立的数据库上运行事务,就像你给出的例子一样。不过,我相信今天人们会以一种最类似restful的方式实现这一点,例如see here。尽管在这些链接中提到了其他一些协议,但最终它们都实现了2PC。
总之,一个2PC协议的实现是最明智的选择之一,它具有在崩溃时撤消/重做的正确操作日志。
关于database - 成语或分布式交易算法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5386510/