在我为客户切换传统的MySQL数据库之前,我需要更好地了解如何(如果可能的话)在同一条目上有多个客户端连接到MongoDB,以解决问题在以下情况下可以处理同一记录的多个更新:
在MySQL情况下,处理这两种情况相当简单(但可能)。
案例' A'将主要在代码中处理,以便UPDATE
请求仅更新已更改的字段,这将导致没有冲突的情况,其中每个客户端更改对由于{导致的任何其他客户端更改没有影响{1}}在更新请求中有所不同。
案例' B'发生在后进基础上,其中客户端更新请求按接收顺序处理,并且(在不太可能的情况下)如果同时接收两个(完全相同的纳秒),则更新的顺序是随机的。
我对MongoDB(作为对象存储的一个例子)的理解是,本身没有记录和字段,并且在您对它们进行结构化时检索这些对象。所以给出以下内容:
field
如果两个客户端都检索到相同的class Person {
int id;
string Name;
string Address
}
对象,并且一个客户端仅对Person
进行了更改;另一个客户端对Person.Name
进行了更改,在MongoDB中更新此对象的唯一方法是发送最初使用修改后的字段检索的整个Person.Address
对象。
这不会导致最后一次客户端更新Person
最终覆盖第一个客户端发送的Person.Address
更改的问题吗?如果是这样,有没有办法使用传统数据库的功能来完成这项工作,其中每个字段都可以独立于同一记录中的其他字段进行更新?
答案 0 :(得分:0)
在这种情况下,MongoDB的行为似乎取决于您选择的操作。 findAndModify是一种原子操作,可锁定,读取,修改,写入和解锁文档,从而阻止并发读/写。
这样,客户端A可以修改Person.Address,而客户端B尝试修改Person.Name,并且不会覆盖任何内容,因为客户端B的findAndModify将被阻止读取,直到客户端A完成操作。 / p>
更新:.Net C#驱动程序中相应的原子方法是UpdateOneAsync。