再試行可能な書き込みを使用すると、ドライバーはネットワークエラーが発生した後、またはレプリカセットまたはシャーディングされたクラスターで正常な プライマリが見つからない場合に、特定の書き込み操作を 1 回再試行できます。
互換性
再試行可能な書き込みには、次のものが必要です。
- 配置トポロジー
- レプリカセットまたはシャーディングされたクラスター。スタンドアロンインスタンスではサポートされていません。
- ストレージ エンジン
- WiredTigerやインメモリなどのドキュメント レベルのロック機能を持つストレージエンジン。
- MongoDB ドライバー
MongoDB 3.6+ と互換性のあるドライバー。
Java 3.6+
Python 3.6+
C 1.9+
Go 1.8+
C# 2.5+
Node 3.0+
Ruby 2.5+
Rust 2.1+
Swift 1.2+
Perl 2.0+
PHPC 1.4+
Scala 2.2+
C++ 3.6.6+
- MongoDB バージョン
- MongoDB 3.6+ および
featureCompatibilityVersion3.6+ (すべてのノードで)setFeatureCompatibilityVersionを参照してください。 - 謝辞の書き込み
- 書込み保証 (write concern)
0を使用する書込みは再試行できません。
動作
再試行可能な書き込みとマルチドキュメントトランザクション
トランザクションのコミット操作と中止操作 は再試行可能です。ドライバーは、retryWrites が false であっても、エラーが発生するとこれらの操作を 1 回再試行します。
retryWrites の値に関係なく、トランザクション内の書き込みは、個別に再試行することはできません。
トランザクションの詳細については、「トランザクション」を参照してください。
再試行可能な書き込みの有効化
- MongoDB ドライバー
- MongoDB 4.2以上と互換性のあるドライバーでは、 の再試行可能な書込みがデフォルトで有効になります。 それ以前のドライバーでは
retryWrites=trueオプションが必要です。 MongoDB 4と互換性のあるドライバーを使用するアプリケーションでは、retryWrites=trueオプションを省略できます。 2以上再試行可能な書き込みを無効にするには、MongoDB 4.2 以降と互換性のあるドライバーを使用するアプリケーションの場合、接続文字列にretryWrites=falseが含まれていなければなりません。 mongoshmongoshでは 再試行可能な書き込みがデフォルトで有効になります。を無効にするには、--retryWrites=false: を使用します。mongosh --retryWrites=false
再試行可能な書き込み操作
MongoDB は、書込み保証 (write concern)が確認された場合、次の操作を再試行します(例、書込み保証 は {w: 0} にできません)。
注意
トランザクション 内の書き込みは個別に再試行できません。
メソッド | 説明 |
|---|---|
Inserts | |
単一ドキュメントの更新 | |
単一ドキュメントの削除 | |
| |
単一ドキュメントの書き込み操作だけで構成される一括書き込み操作。再試行可能な一括操作には、指定された書き込み操作を自由に組み合わせることができますが、 | |
単一ドキュメントの書き込み操作だけで構成される一括書き込み操作。再試行可能な一括操作には、指定された書き込み操作を自由に組み合わせることができますが、 |
永続的なネットワークエラー
MongoDB は書き込みを一度再試行します。これは一時的なネットワークエラーやレプリカセットの選挙には対応しますが、永続的なネットワークエラーには対応しません。
フェイルオーバー期間
ドライバーは再試行する前に新しいプライマリを見つけるまで serverSelectionTimeoutMS 待機します。フェイルオーバーにこのタイムアウトよりも長い時間がかかると、再試行可能な書き込みは失敗します。
警告
クライアントがlocalLogicalSessionTimeoutMinutesを超えて応答しない場合、クライアントが回復すると書き込みが再試行され、再度適用されることがあります。
診断
serverStatus には、transactions セクションに再試行可能な書き込み統計が含まれています。
local データベースに対する再試行可能な書き込み
公式ドライバーではデフォルトで 再試行可能な書込みが有効になります 。再試行可能な書き込みを無効にしない限り、local データベースへの書き込みは失敗します。
無効にするには、retryWrites=false を接続文字列に設定します。
Error Handling
MongoDB 6.1 以降では、再試行可能な書き込みの 1 回目と 2 回目の試行の両方が失敗し、書き込みが 1 つも実行されない場合、MongoDB はNoWritesPerformed ラベルの付いたエラーを返します。
NoWritesPerformed ラベルは、insertMany() のようなバッチ操作の結果とを区別します。insertMany 操作では、次のいずれかの結果が発生する可能性があります。
結果 | MongoDB 出力 |
|---|---|
ドキュメントは挿入されません。 |
|
部分的な作業が完了しました。(少なくとも 1 つのドキュメントが挿入されていますが、すべてではありません。) |
|
すべてのドキュメントが挿入されます。 | 成功が返されました。 |
アプリケーションは NoWritesPerformed ラベルを使用して、ドキュメントが挿入されていないことを明確に判断できます。このエラー報告により、アプリケーションは再試行可能な書き込みを処理する場合にデータベースの正確な状態を維持できます。
前のバージョンの MongoDB では、再試行可能な書き込みの 1 回目と 2 回目の両方が失敗するとエラーが返されました。ただし、書き込みが実行されなかったことを示す区別はありません。