gpt4 book ai didi

c# - 负载测试期间插入时的 MongoDB 竞争条件

转载 作者:行者123 更新时间:2023-12-04 18:05:50 24 4
gpt4 key购买 nike

在进行负载测试时,我有时会遇到这样的情况,这段代码(简化版):

var person = Persons.findOne();
if(person == null){
Persons.insert(newDocument);
}

抛出错误,因为插入操作与现有文档冲突 - 即使我只是使用 findOne() 检查了这一点。 Mongo shell 在 insert() 之前暂停时显示文档。

错误是:

WriteConcern detected an error ''. (Response was { "ok" : 1, "code" : 11000, "err" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: MainDB.Persons.$Person UniquePersonID dup key: { : \"BOT 878611 141152\" }", "n" : NumberLong(0) }).

唯一索引是:

{ v: 1, name: "Person UniquePersonID", key: { UniquePersonID : 1 }, unique: true, ns: "MainDB.Persons", sparse: true, dropDups: true, background: true }

这听起来像是竞争条件,我正试图找到解决这个问题的正确方法:

  1. 使用 $setOnInsert
  2. 使用带有 Upsert 标志的 findAndModify
  3. 使用带有替换和更新插入的更新

这些方法的问题是1+2只替换了某些字段而我想替换整个文档,而方法3替换了整个文档但是_id有冲突。

(如果相关,我使用的是官方 C# 驱动程序版本 1.9.2.235)

感谢您的帮助。

最佳答案

好的,如果我没理解错的话,你想做以下事情:

  1. 检查是否存在具有给定 UniquePersonId 的文档
  2. 如果没有,则插入一个具有该 UniquePersonId 的文档
  3. 如果确实存在这样的文档,则什么也不做。

您的代码由于您认为的原因而遇到重复键错误 - 另一个线程在 findOneinsert 之间插入相同的 UniquePersonId。没关系——这个错误只是告诉代码其他进程已经完成了它的工作。唯一索引违规错误并不是某种错误意义上的错误,即某些东西无法正常工作。它只是让您知道您的操作由于您施加的唯一约束而无效。我认为(在不了解更多上下文的情况下)您可以运行插入并在发生唯一索引错误时吞下它。

关于c# - 负载测试期间插入时的 MongoDB 竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26887707/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com