【问题标题】:MongoDb Upsert DeadlockMongoDb Upsert 死锁
【发布时间】:2011-10-14 14:02:13
【问题描述】:

MongoDb upsert 操作是否可能出现死锁? 我正在对如下所示的 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() 看到,许多更新仍然存在,卡在 lockType:'write' 的锁定:true 中。

为什么会发生这种死锁?这怎么可能?我该如何预防呢?是否有任何具体的指导方针应该避免哪些操作以避免 mongodb 死锁?

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

【问题讨论】:

  • Upsert 是更新操作吗?
  • 这是一个将 upsert 标志设置为 true 的更新

标签: c# multithreading mongodb deadlock upsert


【解决方案1】:

$atomic should help

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

另外,您可能需要一个 $and 子句。检查您对通话的解释以查看正在使用的索引等...

【讨论】:

    猜你喜欢
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多