web-dev-qa-db-ja.com

CollStats結果の「更新の競合」の意味

db.collection.stats()

wiredTiger: {
    .....
    "transaction" : {
        "update conflicts" : NumberInt(1410)
    },
    ....
}

これはMongoDB 3.6ですが、クライアントセッションと再試行可能な書き込みに関連する新機能は使用しません。

以外の数字の意味に関するドキュメントの多くを見つけることができませんでした

同時操作間の競合。

このエラーは、並行操作との競合が原因で操作を完了できない場合に生成されます。操作は再試行される可能性があります。トランザクションが進行中の場合は、それをロールバックして、新しいトランザクションで操作を再試行する必要があります。

at http://source.wiredtiger.com/3.0.0/group__wt.html#ga5ee3c6fcd074e11efd118f3e68e91db8

それは、コレクションが作成されてから1410回失敗した更新があったか、またはそれらの一部が暗黙的に「再試行」されたということですか?

2
Alex Blex

この数は、2つ以上のスレッドがWiredTigerストレージエンジン内の同じドキュメントを更新しようとした回数を記録します。サーバーの再起動間は保持されません。

この統計は、WiredTigerストレージエンジンに固有のものです(WiredTigerセクションにあるため)。 MongoDBでは、これは書き込み競合と呼ばれ、有効な条件下で透過的に再試行されます。

つまり、更新は、競合なしで完了するまで、MongoDBによって(WiredTigerのAPIを使用して)再試行されます。クライアントの観点からは、書き込みは成功しますが、レイテンシの増加を除いて、それ以外の点では正常です。

書き込みの競合は、複数のクライアントが同じドキュメントを1秒未満で更新しようとしていることを示しています。このウィンドウは、WiredTiger APIのWT_SESSION::begin_transaction()操作とWT_SESSION::commit_transaction()操作の実行間の時間です。これらの操作には固定の最小時間はありません。書き込まれるデータの量が少なく、サーバーにCPUまたはメモリチャネルのキューがない場合は、2桁または1桁のマイクロ秒になる可能性があります。最大の固定時間もありませんが、サーバーのパフォーマンスによって多少異なります。

これらの競合は、WiredTigerの楽観的同時実行制御が原因で発生する可能性があります。これは concurrency FAQ for WiredTiger で説明されています)。

WiredTigerとMongoDBはほとんど同じ用語を使用していますが、WiredTigerのソースコード内のコメントは、MongoDBの観点から誤解を招く可能性があることに注意してください。

たとえば、WiredTigerの「トランザクション」は常に利用可能でしたが、MongoDBの「トランザクション」は、MongoDB 4.0のマルチドキュメントACIDトランザクション機能を意味します(この記事の執筆時点ではまだリリースされていません)。

4
kevinadi