2011-10-14 7 views
3

MongoDb upsert操作でデッドロックに達する可能性はありますか?公式のMongoDB C#のドライバとAzureのマシンにデプロイMongoDb Upsertデッドロック

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

: は、私は次のようになりますアップサート操作の負荷テストを行っています。単一インスタンス、レプリカセットまたはシャーディングはまだありません。

この同じ更新コマンドを5000回実行すると、200の同時スレッド(2つのマシン@ 100スレッド)に分割されます。ほとんどの場合、デッドロックで終了します。私。呼び出しの多くは戻ってくることはありません。私はdb.currentOp()からコンソールを介して見ることができますが、多くのアップデートがまだロックされています:true、lockType: 'write'で固定されています。

このデッドロックはなぜ発生しますか?どのように可能ですか?そしてそれをどうやって防ぐのですか? mongodbのデッドロックを回避するために、どのような操作を避けるべきかに関する具体的なガイドラインはありますか?

$ atomicはソリューションに関連していますか?私は$アトミックを設定する方法を知らない:C#では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 
); 

また、あなたは$と句をすることもできます。どのようなインデックスが使用されているかを確認するためにあなたの呼び出しのあなたの説明を確認してください...