是否有可能在 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() 中看到,许多更新仍然存在,卡在 lockType:'write' 的锁定:true 中。
为什么会发生这种僵局?这怎么可能?我该如何预防呢?是否有任何具体的指导方针应该避免哪些操作以避免 mongodb 死锁?
$atomic 与解决方案有关吗?我什至不知道如何在 c# 上设置 $atomic:true,尽管它可能与这个死锁问题无关。