2011-10-14 106 views
3

是否有可能在MongoDb的upsert操作上遇到死鎖?MongoDb Upsert死鎖

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

部署Azure的計算機上,使用官方MongoDB的C#驅動程序: 我上UPSERT操作,看起來像進行負載測試。單個實例,沒有副本集或分片。

當我運行5000這個相同的更新命令,分裂200個併發線程(2臺機器@每100線程),大部分時間它會以死鎖結束。即許多電話不會回來。我可以通過控制檯從db.currentOp()中看到,許多更新仍然存在,並鎖定在locked:true,lockType:'write'中。

爲什麼會發生這種僵局?這怎麼可能?我該如何預防它?有沒有什麼特定的指導方針應該避免什麼樣的操作來避免mongodb上的死鎖?

是$原子與解決方案相關嗎?我甚至不知道如何在c#上設置$ atomic:true,儘管這可能與這個死鎖問題無關。

+0

Upsert是一個更新操作? – sll

+0

這是將upsert標誌設置爲true的更新 – Sheepy

回答

0

$atomic should help

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

也,你可能想的$和條款。檢查您的電話解釋,看看正在使用的索引,等等...