【问题标题】:Idioms or algorithms for distributed transactions?分布式事务的习语或算法?
【发布时间】:2011-07-20 04:20:09
【问题描述】:

假设您在不同的系统上有 2 个实体,需要执行某种交易,根据与其中一个或两个实体相关的信息更改其中一个或两个,并要求对两个实体的更改要么完成,要么都不完成他们中的一个。

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

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

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

【问题讨论】:

  • 不完全是。无论出于何种原因,当数据本质上分布时,镜像都不起作用。即使您确实有镜像,我认为仍然必须执行几乎相同的逻辑以确保一致性。此外,数据库复制通常会损害写入性能以提高读取性能,而这个问题都是关于写入的。
  • 我可以向您保证,在现实世界中,有时存在内在数据分布。你认为 Facebook 是否将其所有用户数据都保存在一个数据库中,并在任何地方进行镜像?不 - 它在多个系统中分片。至于镜像事务失败时会发生什么,您错过了我的观点 - 让事务在整个集群中的任何地方都失败或成功将需要与您无论如何都需要实现事务相同的协商机制,以确保它是处处提交或处处回滚。
  • 至于银行的表现,银行确实担心交易的吞吐率,因为任何延迟都会让他们损失金钱,但这并不真正相关,因为我不是专门询问银行交易,而是询问分布式交易.前者只是后者的一个子集,我希望会有不同的方法来优化读取访问、写入访问、可靠性等。

标签: database distributed distributed-transactions


【解决方案1】:

还有 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 协议实现与适当的操作日志以在崩溃的情况下撤消/重做是最明智的选择之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-12
    • 2011-11-20
    • 2015-07-02
    • 2012-08-31
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多