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