使用MongoDB从不同客户端同时对同一对象进行多次更新

时间:2016-08-10 18:49:24

标签: c# mysql mongodb

在我为客户切换传统的MySQL数据库之前,我需要更好地了解如何(如果可能的话)在同一条目上有多个客户端连接到MongoDB,以解决问题在以下情况下可以处理同一记录的多个更新:

  • 答:每个客户都会更改一个不同的字段'在同一个对象中
  • B:每个客户都对同一个字段进行了更改'在同一个对象中

在MySQL情况下,处理这两种情况相当简单(但可能)。

案例' A'将主要在代码中处理,以便UPDATE请求仅更新已更改的字段,这将导致没有冲突的情况,其中每个客户端更改对由于{导致的任何其他客户端更改没有影响{1}}在更新请求中有所不同。

案例' B'发生在后进基础上,其中客户端更新请求按接收顺序处理,并且(在不太可能的情况下)如果同时接收两个(完全相同的纳秒),则更新的顺序是随机的。

我对MongoDB(作为对象存储的一个例子)的理解是,本身没有记录和字段,并且在您对它们进行结构化时检索这些对象。所以给出以下内容:

field

如果两个客户端都检索到相同的class Person { int id; string Name; string Address } 对象,并且一个客户端仅对Person进行了更改;另一个客户端对Person.Name进行了更改,在MongoDB中更新此对象的唯一方法是发送最初使用修改后的字段检索的整个Person.Address对象。

这不会导致最后一次客户端更新Person最终覆盖第一个客户端发送的Person.Address更改的问题吗?如果是这样,有没有办法使用传统数据库的功能来完成这项工作,其中每个字段都可以独立于同一记录中的其他字段进行更新?

1 个答案:

答案 0 :(得分:0)

在这种情况下,MongoDB的行为似乎取决于您选择的操作。 findAndModify是一种原子操作,可锁定,读取,修改,写入和解锁文档,从而阻止并发读/写。

这样,客户端A可以修改Person.Address,而客户端B尝试修改Person.Name,并且不会覆盖任何内容,因为客户端B的findAndModify将被阻止读取,直到客户端A完成操作。 / p>

更新:.Net C#驱动程序中相应的原子方法是UpdateOneAsync。