MongoDB多重更新隔离

时间:2018-04-19 16:21:29

标签: mongodb

我对 MongoDB 更新如何运作感到困惑。

在以下文档中:https://docs.mongodb.com/manual/core/write-operations-atomicity/说:

  

在MongoDB中,写操作在单个级别上是原子的   文档,即使操作修改了多个嵌入文档   在一份文件中。

     

当单个写操作修改多个文档时,   每个文件的修改都是原子的,但操作整体   不是原子的,其他操作可能会交错。

我想这意味着:如果我正在更新文档的所有字段,我将无法看到部分更新:

  • 如果我在更新之前收到文档,我会看到它没有任何更改
  • 如果我在更新后收到文档,我会看到所有更改

对于多个元素,每个文档都会发生相同的行为。我想我们可以说每个文档更新都有一个事务,而不是所有文档更新。

但是,让我们说多次更新有很多文档,需要一段时间来更新所有这些文档。在更新期间其他线程的查询会发生什么?

  • 他们会看到旧版本?或者它们将被阻止,直到更新完成?
  • 在此大更新期间,是否可以对相同文档进行其他更新?如果是这样,这个中间更新是否可以从大更新中排除某些文档?

1 个答案:

答案 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}