为什么抛出重复键错误并且仍然插入值
本文关键字:插入 错误 为什么 | 更新日期: 2023-09-27 18:36:43
使用 c# 将文档插入到集合中
{
"_id" : UUID("some_guid")
}
通过
db.collection.insert(new { id = a_guid });
我们通过在文档中指定 id 来依赖 guid/uuid 的唯一性,这意味着 mongo db 驱动程序不会这样做。
现在,所有这些都包含在尝试中。捕获捕获重复键异常的位置。 调用代码使用此例程进行冲突检查。也就是说,如果以前没有遇到过 guid - 插入它 - 下次尝试再次插入相同的值时,异常让我们现在有一个重复项。
我们似乎陷入了这样一种情况:写入了值,但仍抛出异常,这表明在没有异常的情况下存在冲突。
我们已经在 3 节点副本集中工作了。
它在 5 节点副本集中不起作用,声称是健康的。 写入关注点设置为 1,表示当主节点写入(但不是日志)时进行确认,就像 3 节点集一样。
我应该在哪里深入挖掘?重复的异常派生自 writeconcern 异常,这里发生了什么问题吗?mongo 驱动程序是否正确解释错误并引发正确的异常?
任何线索都会很棒!
编辑:
var database = this.client.GetServer().GetDatabase("A_Database");
var collection = database.GetCollection<object>("A_Collection");
try
{
collection.Insert(new { Id = paymentReference.ToGuid() });
}
catch (MongoDuplicateKeyException)
{
return false;
}
return true;
这不是在循环中调用的。
您可以捕获异常基MongoWriteException
并按类别进行筛选,示例代码:
var database = this.client.GetServer().GetDatabase("A_Database");
var collection = database.GetCollection<object>("A_Collection");
try
{
collection.Insert(new { Id = paymentReference.ToGuid() });
}
catch (MongoWriteException ex) when(ex.WriteError.Category == ServerErrorCategory.DuplicateKey)
{
return false;
}
return true;
Hear是代码的固定版本
var database = this.client.GetServer().GetDatabase("A_Database");
var collection = database.GetCollection<object>("A_Collection");
try
{
collection.Insert(new { Id = paymentReference.ToGuid() });
}
catch (Exception)
{
collection.Insert(new { Id = Guid.NewGuid(); });
return tru;
}
return true;