3

MongoDb アップサート操作でデッドロックに達する可能性はありますか? 次のような 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' で locked:true にスタックしています。

このデッドロックはなぜ起こるのでしょうか? それはどのように可能ですか?どうすればそれを防ぐことができますか?mongodb のデッドロックを回避するために、どのような操作を避けるべきかについての特定のガイドラインはありますか?

$atomic はソリューションに関連していますか? C# で $atomic:true を設定する方法もわかりませんが、おそらくこのデッドロックの問題とは関係ありません。

4

1 に答える 1

0

$atomic が役立つはずです

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

また、$and 句が必要な場合もあります。どのインデックスが使用されているかなどを確認するには、呼び出しの説明を確認してください...

于 2012-04-23T20:52:49.073 に答える