MongoDb Upsert死锁

时间:2011-10-14 14:02:13

标签: c# multithreading mongodb deadlock upsert

是否有可能在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个线程)之间进行拆分,大多数情况下它将以死锁结束。即很多电话都没有回来。我可以通过控制台从db.currentOp()看到,许多更新仍然存在,卡在一个锁定的:true,带有lockType:'write'。

为什么会出现这种僵局?这怎么可能?我该如何预防呢?是否有任何特定的指导方针应该避免哪种操作以避免mongodb上的死锁?

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

1 个答案:

答案 0 :(得分:0)

$atomic should help

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

另外,您可能需要$和子句。检查你的电话解释,看看正在使用的索引等等......