我对 MongoDB 更新如何运作感到困惑。
在以下文档中:https://docs.mongodb.com/manual/core/write-operations-atomicity/说:
在MongoDB中,写操作在单个级别上是原子的 文档,即使操作修改了多个嵌入文档 在一份文件中。
当单个写操作修改多个文档时, 每个文件的修改都是原子的,但操作整体 不是原子的,其他操作可能会交错。
我想这意味着:如果我正在更新文档的所有字段,我将无法看到部分更新:
对于多个元素,每个文档都会发生相同的行为。我想我们可以说每个文档更新都有一个事务,而不是所有文档更新。
但是,让我们说多次更新有很多文档,需要一段时间来更新所有这些文档。在更新期间其他线程的查询会发生什么?
答案 0 :(得分:1)
他们会看到旧版本吗?或者它们将被阻止,直到更新完成?
我猜其他线程可能会看到旧版本的文档或新版本,具体取决于他们是在更新完成之前还是之后查询文档,但是他们永远不会看到文档的部分更新(即一个字段已更改)而另一个没有改变。)
在此次大更新期间,是否可以对相同文档进行其他更新?如果是这样,这个中间更新是否可以从大更新中排除某些文档?
考虑2个线程在同一文档上进行更新,而不是大或小的更新。线程1设置字段{a:1, b:2}
,线程2设置{b:3, c:4}
。如果原始文档是{a:0, b:0, c:0}
,那么我们可以有两种情况:
在更新2之前执行更新1:
该文件最终将为{a:1, b:3, c:4}
。
在更新1之前执行更新2:
该文件最终将为{a:1, b:2, c:4}
。