Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MongoDb Upsert死锁_C#_Multithreading_Mongodb_Deadlock_Upsert - Fatal编程技术网

C# MongoDb Upsert死锁

C# MongoDb Upsert死锁,c#,multithreading,mongodb,deadlock,upsert,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个并发线程(每个线程有两

MongoDb upsert操作是否可能出现死锁? 我正在对一个upsert操作执行负载测试,该操作如下所示:

db.update(
    { foo: {a: 'xxx', b: 'yyy'}, $lt: {"order.date": someDate}}, 
    {order: order}, 
    true, false);
使用官方mongodb C#驱动程序部署在Azure机器上。单实例,没有副本集或分片

当我运行5000个相同的更新命令时,在200个并发线程(每个线程有两台机器@100个线程)中进行分割,大多数情况下,它将以死锁结束。也就是说,许多电话再也没有回过。我可以通过控制台从db.currentOp()中看到,许多更新仍然存在,卡在一个locked:true中,lockType:'write'

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

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


此外,您可能需要$and子句。检查调用的解释,查看正在使用的索引等。

Upsert是一个更新操作?它是一个Upsert标志设置为true的更新
db.update(
    {
        $and: [
            { foo: { a: 'xxx', b: 'yyy' },
            { $lt: { 'order.date': someDate } }
        ],
        $atomic: true
    },
    { order: order },
    true,
    false
);