MongoDB 在事务中读取文档

标签 mongodb transactions

假设我在 MongoDB 中执行以下操作列表

  • 开始 session
  • 为该 session 开始交易
  • 使用新文档运行 insert 命令
  • 对插入文档的集合运行查找命令
  • 提交交易
  • 结束 session

我知道在事务之外,第三步中完成的插入在事务提交之前是不可见的,但是在事务中呢,find 会在第四步运行吗?这个新文件还是不会?

最佳答案

是的,事务性查找 看到一个文档插入到先前的事务性insert 中。您可以假定 Read your own writes 属性。


每次开始交易时,都会创建一个新的快照。在事务之外,快照显然是不可见的:这是通过使用(如果您的事务涉及许多更新则滥用)WiredTiger 缓存来实现的。此缓存的结构为一棵树,类似于以下1:

wiredtiger cache

其中每个交易操作都表示为一个新的更新 block ,该更新 block 又可以链接到另一个更新 block 。

外部操作只能看到非事务性树条目,而事务性操作会看到在拍摄快照之前添加的所有条目 + 给定事务的更新 block 。

我知道这是关于 MongoDB 如何管理事务原子性的非常简短的解释,但如果您有兴趣了解更多,那么我建议您阅读 report我已经写了。在同一个存储库中,您可以找到一些 scenarios对于最典型的疑惑。


1:图片取自 Aly Cabral 关于 How and when to use Multi-document transactions 的演讲

关于MongoDB 在事务中读取文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68771324/

相关文章:

node.js - 将国家作为 Mongoose (mongodb)对象的属性来处理的理想方式是什么

java - 使用 java 验证来自 MongoDB 的数据

node.js - 通过在 Mongodb 中应用条件,使用 $find 查询嵌套对象

mysql - 使用 MySQL 事务时,Sphinx 索引器不获取数据

django - 长时间运行的 django 事务完整性错误

c# - NServiceBus 事务何时结束,发送给订阅者或所有订阅者都收到消息时?

mongodb - spring-boot mongodb 4.0 兼容性

java - 如何在mongodb中找到匹配的记录?

c# - ado.net transaction.commit 抛出信号量异常

php - 将 LAST_INSERT_ID() 存储在事务中