【发布时间】:2021-06-18 09:19:16
【问题描述】:
我有一份文件需要阅读和更新。同时,很可能另一个进程也在做同样的事情,这会破坏文档更新。
例如,如果进程 A 读取文档 d 并在其中添加字段 'a' 并写入文档,并且进程 B 在进程 A 写入之前读取文档 d,并添加字段 b 并写入文档,那么无论哪个进程写入输出的更改将得到它们的更改,因为它破坏了第一个编写的更改。
我已经阅读了这篇文章以及其他一些关于 mongo 的非常复杂的事务文章。有人可以描述一个简单的解决方案吗?我还没有遇到让我对此感到满意的东西。
https://www.mongodb.com/blog/post/how-to-select--for-update-inside-mongodb-transactions
[更新]- 此外,我正在尝试扩充一个可能尚不存在的文档。如果文档不存在,我需要创建它。我还需要阅读它来分析它。一个关键是“relatedIds”(一个数组)。如果在其中找不到 id,我会推送到该数组。如果文档不存在,我需要创建文档的另一种方法添加到单独的对象集合中。
[ANOTHER UPDATE x2] --> 根据我一直在阅读和从各种来源获得的信息 - 正确为此创建事务的唯一方法是“findOneAndModify”文档以将其标记为脏某些肯定会更新的字段,例如带有 objectId 的“锁定”(因为这永远不会导致 NO-OP - 即,它肯定会导致更改)。
如果另一个操作尝试写入它,Mongo 现在可以检测到该记录已经是事务的一部分。
因此,任何写入它的内容都会在其他操作上导致 writeError。然后我的事务可以慢慢地处理该记录并锁定它。当它写出并提交时,该记录绝对不会被其他任何东西触及。如果由于某种原因没有交易就无法做到这一点,那么我是否在这里以最简单的方式创建交易?
【问题讨论】:
标签: mongodb transactions select-for-update