gpt4 book ai didi

couchdb - 键值存储中的原子事务

转载 作者:行者123 更新时间:2023-12-02 02:48:09 25 4
gpt4 key购买 nike

请原谅任何术语错误。特别是,我正在使用关系数据库术语。

有许多持久键值存储,包括 CouchDBCassandra ,以及许多其他项目。

反对它们的一个典型论点是它们通常不允许跨多行或多表的原子事务。我想知道是否有一个通用方法可以解决这个问题。

以一组银行账户的情况为例。我们如何将钱从一个银行账户转移到另一个银行账户?如果每个银行帐户都是一行,我们希望更新两行作为同一交易的一部分,减少一行中的值并增加另一行中的值。

一个明显的方法是使用一个单独的表来描述事务。然后,将资金从一个银行帐户转移到另一个银行帐户只需在此表中插入一个新行即可。我们不存储两个银行帐户中任何一个的当前余额,而是依靠对交易表中所有相应行进行求和。然而,很容易想象这会是太多的工作。一家银行每天可能有数百万笔交易,而一个个人银行账户可能很快就会有数千笔与之相关的“交易”。

如果基础数据自您上次获取以来发生了更改,许多(全部?)键值存储将“回滚”操作。可能这可以用于模拟原子事务,然后,您可以指示特定字段被锁定。这种方法存在一些明显的问题。

还有其他想法吗?完全有可能我的方法根本不正确,而且我还没有完全接受新的思维方式。

最佳答案

以您的示例为例,如果您希望自动更新单个文档中的值(关系术语中的行),则可以在 CouchDB 中执行此操作。当您尝试提交更改时,如果其他竞争客户端在您阅读后更新了同一文档,您将收到冲突错误。然后,您必须读取新值、更新并重新尝试提交。您可能必须重复此过程的次数是不确定的(如果存在大量争用,则可能是无限的),但可以保证数据库中的文档具有自动更新的余额,如果您的提交将会成功。

如果您需要更新两个余额(即从一个账户转账到另一个账户),那么您需要使用一个单独的交易文档(实际上是另一个表,其中行是交易)来存储金额和两个账户(在并出)。顺便说一句,这是一种常见的簿记做法。由于 CouchDB 仅根据需要计算 View ,因此从列出帐户的交易中计算帐户中的当前金额实际上仍然非常有效。在 CouchDB 中,您将使用映射函数,该函数发出帐号作为键和交易金额(正数表示传入,负数表示传出)。您的reduce 函数将简单地对每个键的值求和,发出相同的键和总和。然后,您可以使用 group=True 的 View 来获取按帐号键入的帐户余额。

关于couchdb - 键值存储中的原子事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1093115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com