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