【发布时间】:2021-02-27 15:57:05
【问题描述】:
感谢您在我将其提交给某些代码之前回答这个问题。
我已经查看了 MongoDB 上的多个文档和各种论坛来寻找这个问题的答案,但是,我想根据我的具体情况确切地知道某些系列操作是如何执行的。
基本上,我想在其自己的分片内对集合中的特定文档执行读取(findOne)操作,以获取其当前值,对其进行修改,然后将其存储回该文档(findOneAndUpdate)。这听起来很容易,但是,如果我理解正确的话,这个特定的文档可能会在读取和写入操作之间的延迟期间被写入。
有关更多上下文,这是一个基于股票市场的应用程序。我在这里指的分片和集合是用户的投资组合,其中包含诸如股票代码、拥有该股票的股票数量以及他们历史上为此支付的总成本等信息。这里的问题是,当玩家出售股份时,我必须通过乘以 (formerOwnedShares - executedSoldShares)/(formerOwnedShares) 的比率来按比例调整历史总成本,其中,formerOwnedShares 是需要读取、处理、然后更新的信息(即用户当前拥有 10 股,并随着时间的推移支付了 10 美元,他们卖出 5 股,现在他们拥有 5 股并支付 5 美元以维持一致的每股平均成本)。
我担心读取和更新操作之间的延迟。其他几个代码区域可以从其他用户(例如其他用户与他们购买/出售股票)对该投资组合文档进行操作,因此第一个读取操作很有可能从该文档的旧版本中提取信息,该版本具有最近才更新。
有没有办法在一个原子操作中处理这种情况以保持完美的并发性?问题显然是必须根据文档的最新值更新文档值的结果 - 我认为您无法在单个 findOneAndUpdate 操作中完成。
非常感谢您的宝贵时间。
【问题讨论】:
标签: javascript database mongodb performance concurrency