MongoDB 在事务中读取文件
MongoDB read documents within transaction
假设我在 MongoDB
中执行以下操作列表
- 开始会话
- 开始该会话的交易
- 运行 带有新文档的
insert
命令
- 运行一个
find
命令对插入文档的集合
- 提交交易
- 结束会话
我知道在事务外部,第三步中完成的插入在事务提交之前是不可见的,但是在事务内部呢,find
运行 中的 find
运行第四步看这个新文件要不要?
是的,事务 find
看到一个文档插入到先前的事务 insert
中。您可以假设 阅读您自己的文章 属性.
每次启动事务时都会创建一个新快照。在事务之外,快照显然是不可见的:这是通过使用(如果您的事务涉及许多更新则滥用)WiredTiger 缓存来实现的。这个缓存的结构是一棵树,类似于下面的1:
其中每个交易操作都表示为一个新的更新块,该更新块又可以链接到另一个更新块。
外部操作只能看到非事务性树条目,而事务性操作会看到在拍摄快照之前添加的所有条目 + 给定事务的更新块。
我知道这是一个关于 MongoDB 如何管理事务原子性的非常简短的解释,但如果您有兴趣了解更多,那么我建议您阅读 report I have written. in the same repository you can find some scenarios最典型的疑惑。
1:图片取自 Aly Cabral 关于 How and when to use Multi-document transactions
的演讲
假设我在 MongoDB
中执行以下操作列表- 开始会话
- 开始该会话的交易
- 运行 带有新文档的
insert
命令 - 运行一个
find
命令对插入文档的集合 - 提交交易
- 结束会话
我知道在事务外部,第三步中完成的插入在事务提交之前是不可见的,但是在事务内部呢,find
运行 中的 find
运行第四步看这个新文件要不要?
是的,事务 find
看到一个文档插入到先前的事务 insert
中。您可以假设 阅读您自己的文章 属性.
每次启动事务时都会创建一个新快照。在事务之外,快照显然是不可见的:这是通过使用(如果您的事务涉及许多更新则滥用)WiredTiger 缓存来实现的。这个缓存的结构是一棵树,类似于下面的1:
其中每个交易操作都表示为一个新的更新块,该更新块又可以链接到另一个更新块。
外部操作只能看到非事务性树条目,而事务性操作会看到在拍摄快照之前添加的所有条目 + 给定事务的更新块。
我知道这是一个关于 MongoDB 如何管理事务原子性的非常简短的解释,但如果您有兴趣了解更多,那么我建议您阅读 report I have written. in the same repository you can find some scenarios最典型的疑惑。
1:图片取自 Aly Cabral 关于 How and when to use Multi-document transactions
的演讲