【发布时间】: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