c# - MongoDb Upsert死锁

标签 c# multithreading mongodb deadlock upsert

是否有可能在 MongoDb upsert 操作中出现死锁? 我正在对如下所示的更新插入操作执行负载测试:

db.update(
    { foo: {a: 'xxx', b: 'yyy'}, $lt: {"order.date": someDate}}, 
    {order: order}, 
    true, false);

使用官方 mongodb C# 驱动程序部署在 Azure 机器上。单个实例,还没有副本集或分片。

当我运行 5000 个相同的更新命令时,分配给 200 个并发线程(2 台机器,每台机器 100 个线程),大多数情况下它会以死锁结束。 IE。许多电话再也回不来了。我可以通过控制台从 db.currentOp() 中看到,许多更新仍然存在,卡在 locked:true, lockType:'write' 中。

为什么会出现这种死锁?这怎么可能?我该如何预防呢?是否有关于应避免何种操作以避免 mongodb 死锁的具体指南?

$atomic 与解决方案相关吗?我什至不知道如何在 C# 上设置 $atomic:true,尽管它可能与这个死锁问题无关。

最佳答案

$atomic should help

db.update(
    {
        $and: [
            { foo: { a: 'xxx', b: 'yyy' },
            { $lt: { 'order.date': someDate } }
        ],
        $atomic: true
    },
    { order: order },
    true,
    false
);

此外,您可能需要一个 $and 子句。检查你的电话解释,看看正在使用哪些索引,等等......

关于c# - MongoDb Upsert死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7768781/

相关文章:

mongodb - 访问 MongoDB 聚合结果中的上一个文档

C# 在字典中存储函数

python - 所有任务的单个工作线程还是多个特定的工作线程?

javascript - 自动递增序列字段错误 - MongoDB、Mongoose

c# - WinForms 中的部分类

java - ExecutorService 并发行为不稳定且不稳定

php - MongoDB(第一列大于第二列?)(php)

c# - 如何确定日期是否位于当前周日期之间?

c# - 从文件中打开图像,然后释放锁定?

c# - 找不到 32 位 DLL 的入口点。使用 64 位 DLL