MongoDB 事务中如何读取文档。

6
假设我在MongoDB中执行以下操作列表:
  • 开始一个会话
  • 为该会话启动一个事务
  • 使用新文档运行insert命令
  • 在插入文档的集合上运行find命令
  • 提交事务
  • 结束会话
我知道在事务提交之前,第三步中进行的插入操作在事务外部是不可见的,但在事务内部呢?在第四步中运行的find命令能否看到这个新文档?
1个回答

7
是的,事务性的find会看到在之前的事务性insert中插入的文档。您可以假定具有读你自己写属性。
每次启动事务时,都会创建一个新的快照。在事务之外,快照显然是不可见的:这是通过使用(如果您的事务涉及许多更新,则滥用)WiredTiger缓存来实现的。该缓存结构类似于以下树形结构1:

wiredtiger cache

每个事务操作都表示为一个新的更新块,可以将其链接到另一个更新块。

外部操作只看到非事务性树条目,而事务性操作看到在快照被取出之前添加的所有条目+给定事务的更新块。

我知道这只是关于MongoDB如何管理事务原子性的简要说明,但如果您有兴趣了解更多信息,那么我建议您阅读我写的报告。在同一存储库中,您可以找到一些场景以解决最常见的疑问。


1: 图片来自Aly Cabral有关如何和何时使用多文档事务的演示。


谢谢!如果您像我一样遇到了麻烦 - findOneAndUpdate 找到值并返回其前一个值。如果要进行 updatefind 操作,您必须分别执行它们以在事务中查看更新后的值。这使我困惑了几个小时。我不确定为什么我的 findOneAndUpdate 一直返回旧属性。我以为 update 根本没有发生或者在事务上下文中不可见。 - fIwJlxSzApHEZIl
有一个 returnDocument 参数可以传递给 findOneAndUpdate,当设置为 "after" 时,将在更新之后返回值。 - ambi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接