MongoDB 在事务中读取文档

Car*_*dos 6 transactions mongodb

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

  • 开始会话
  • 为该会话启动事务
  • insert使用新文档运行命令
  • find对插入文档的集合运行命令
  • 提交交易
  • 结束会话

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

Mar*_*ara 7

是的,事务性find会看到插入到先前事务性中的文档insert。您可以假定“读取您自己的写入”属性。


每次启动事务时都会创建一个新快照。在事务之外,快照显然是不可见的:这是通过使用(如果事务涉及许多更新则滥用)WiredTiger 缓存来完成的。该缓存的结构为一棵树,类似于下面的1

有线老虎缓存

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

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

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


1:图片取自 Aly Cabral 关于如何以及何时使用多文档交易的演示