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

标签 c# mysql mongodb

在为客户切换传统的 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/

相关文章:

c# - 合并具有重复键的字典生成子字典

c# - 如何编写转换器类?如何高效编写映射规则?

c# - 从文件中读取字符串使用哪种编码?

java - 使用相同的条件编辑 Mysql 表

c# - MongoDB 按 "starts with"排序

c# - 通过 .Net Socket 发送/接收为串行通信构建的消息

php - CodeIgniter加入问题

mysql - 为什么当我尝试将主键设置为无符号时出现 errno150

mongodb - 无法通过 ssh 在 ubuntu docker 容器中运行 mongod(Docker 使用 "--net=host"启动)

ruby-on-rails - Ruby 字符串到 Date 对象