为什么抛出重复键错误并且仍然插入值
Why is a duplicate key error being thrown and value still inserted
使用 c# 将文档插入到集合中
{
"_id" : UUID("some_guid")
}
通过
db.collection.insert(new { id = a_guid });
我们通过在文档中指定 id 来依赖 guid/uuid 的唯一性,这意味着 mongo 数据库驱动程序不会这样做。
现在,所有这些都包含在 try..catch 中,其中捕获了重复键异常。调用代码使用此例程进行冲突检查。也就是说,如果以前没有遇到过 guid - 插入它 - 下次尝试再次插入相同的值时,异常让我们现在有一个重复项。
我们似乎遇到了这样一种情况,即写入了值但仍会抛出异常,这表明没有冲突的地方存在冲突。
我们已经在一个 3 节点的副本集中进行了这项工作。
它在 5 节点副本集中不工作,声称是健康的。 write concern 设置为 1,表示写入 master(但不是日志)时的确认,就像 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;
这不是在循环中调用的。
听说你的代码有一个固定版本
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;
您可以捕获异常基数 MongoWriteException
并按类别使用 when 进行过滤,示例代码:
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;
使用 c# 将文档插入到集合中
{
"_id" : UUID("some_guid")
}
通过
db.collection.insert(new { id = a_guid });
我们通过在文档中指定 id 来依赖 guid/uuid 的唯一性,这意味着 mongo 数据库驱动程序不会这样做。
现在,所有这些都包含在 try..catch 中,其中捕获了重复键异常。调用代码使用此例程进行冲突检查。也就是说,如果以前没有遇到过 guid - 插入它 - 下次尝试再次插入相同的值时,异常让我们现在有一个重复项。
我们似乎遇到了这样一种情况,即写入了值但仍会抛出异常,这表明没有冲突的地方存在冲突。
我们已经在一个 3 节点的副本集中进行了这项工作。
它在 5 节点副本集中不工作,声称是健康的。 write concern 设置为 1,表示写入 master(但不是日志)时的确认,就像 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;
这不是在循环中调用的。
听说你的代码有一个固定版本
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;
您可以捕获异常基数 MongoWriteException
并按类别使用 when 进行过滤,示例代码:
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;