C# MongoDb Upsert死锁
MongoDb upsert操作是否可能出现死锁? 我正在对一个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个并发线程(每个线程有两
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
);