

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon DocumentDB での再試行可能な書き込み
<a name="retryable-writes"></a>

エンジンバージョン 8.0.2 以降、Amazon DocumentDB は再試行可能な書き込みをサポートしています。一時的なネットワークエラーまたはプライマリ選択が原因で書き込みオペレーションが失敗した場合、ドライバーは自動的にオペレーションを 1 回だけ再試行できます。Amazon DocumentDB は、再試行された書き込みを重複排除して、操作が最大 1 回適用されるようにし、べき等性を維持します。

再試行可能な書き込みには、再試行可能な書き込みプロトコルをサポートする MongoDB 互換ドライバーが必要です。最新の MongoDB 互換ドライバーは、デフォルトで再試行可能な書き込みを有効にします (`retryWrites=true`接続文字列の )。以前のバージョンからエンジン 8.0.2 にアップグレードする場合は、接続文字列`retryWrites=false`から を削除してこの機能を有効にできます。

## 要件
<a name="retryable-writes-requirements"></a>

再試行可能な書き込みを使用するには、次の要件を満たす必要があります。
+ Amazon DocumentDB エンジンバージョン 8.0.2 以降。
+ 再試行可能な書き込みをサポートする MongoDB 互換ドライバー。最小バージョンについては、ドライバーのドキュメントを参照してください。
+ 接続文字列には が含まれている必要があります。含まれていない場合`retryWrites=true`、ドライバーはデフォルトで再試行可能な書き込みにする必要があります (最新のドライバーは です）。

## サポートされているオペレーション
<a name="retryable-writes-supported-operations"></a>

再試行可能な書き込みは、個々の書き込みが最大 1 つのドキュメントに影響する書き込みオペレーションに適用されます。バッチ内の各書き込みは個別に重複排除されるため、バッチオペレーションは適格です。

次の書き込みオペレーションは再試行可能です。
+ `insertOne`
+ `insertMany`
+ `updateOne`
+ `deleteOne`
+ `findOneAndUpdate`
+ `findOneAndDelete`
+ `findOneAndReplace`
+ `bulkWrite` (`insertOne`、、`updateOne`、`deleteOne`または `replaceOne`オペレーションで構成される場合)

`insertMany` および の場合`bulkWrite`、バッチ内の各ドキュメントは個別に重複排除されます。再試行が必要な場合は、まだ適用されていないドキュメントのみが挿入されます。

**注記**  
`commitTransaction` および `abortTransaction`は、書き込みとしてではなくトランザクション制御コマンドとして再試行することもできます。トランザクション内の個々の書き込みは再試行できません。詳細については、「[制限事項](#retryable-writes-limitations)」を参照してください。

## 制限事項
<a name="retryable-writes-limitations"></a>

Amazon DocumentDB での再試行可能な書き込みには、次の制限が適用されます。
+ `updateMany` と `deleteMany`は再試行できません。
+ マルチステートメントトランザクション内の書き込みは再試行できません。トランザクションのコミットオペレーションと中止オペレーションは個別に再試行できます。
+ ドキュメントには、再試行可能な挿入の `_id`フィールドが含まれている必要があります。
+ 再試行可能な書き込みは、エンジンバージョン 8.0.2 以降でのみ使用できます。以前のエンジンバージョンでは、エラーを回避するために接続文字列`retryWrites=false`に を設定します。
+ クエリプランナーバージョン 1.0 を使用するクラスターでは、書き込みオペレーションを再試行できません。
+ 大きなドキュメントを返す `findOneAndUpdate`、`findOneAndDelete`、および `findOneAndReplace`オペレーションでは、完全な結果ドキュメントが重複排除のためにキャッシュされるため、再試行可能な書き込みによって書き込みレイテンシーが増加する可能性があります。書き込みパフォーマンスが重要で、返されるドキュメントが大きい場合は、それらのワークロード`retryWrites=false`に対して を設定することを検討してください。

## 再試行可能な書き込みの有効化
<a name="retryable-writes-enabling"></a>

再試行可能な書き込みを有効にするには、接続文字列`retryWrites=true`に を含めます。

```
mongodb://{{<username>}}:{{<password>}}@{{<cluster-endpoint>}}:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=true
```

ドライバーのデフォルトが の場合`retryWrites=true`、接続文字列`retryWrites=false`から明示的なものをすべて削除できます。

完全な接続文字列のチュートリアルについては、「」を参照してください[プログラムによる Amazon DocumentDB への接続](connect_programmatically.md)。

## 再試行可能な書き込みの仕組み
<a name="retryable-writes-how-it-works"></a>

アプリケーションで を使用して書き込みを送信すると`retryWrites=true`、ドライバーは論理セッション ID (`lsid`) とトランザクション番号 (`txnNumber`) を書き込みコマンドにアタッチします。Amazon DocumentDB は、これらの識別子を使用して書き込みを重複排除します。
+ 最初の試行では、Amazon DocumentDB は書き込みを実行し、結果をキャッシュします。
+ ドライバーが同じ書き込みを再試行した場合 (同じ `lsid`と `txnNumber`)、Amazon DocumentDB は書き込みを再実行せずにキャッシュされた結果を返します。
+ Amazon DocumentDB は、元の書き込みから 60 分間の再試行を受け入れます。ドライバーはすぐに再試行するため、このウィンドウはドライバーが必要とするよりもはるかに長くなります。

元の書き込みから 60 分以上後に再試行が到着した場合、Amazon DocumentDB にはキャッシュされた結果はなく、新しいオペレーションとして書き込みが実行されます。

## エラー処理
<a name="retryable-writes-errors"></a>

次のエラーは、Amazon DocumentDB での再試行可能な書き込みに固有のものです。


| エラーコード | 名前 | 説明 | 
| --- | --- | --- | 
| 225 | TransactionTooOld | 同じセッションとステートメントの新しいトランザクション番号がすでにコミットされているため、この再試行は古すぎて適用できません。 | 
| 301 | 再試行可能な書き込みはサポートされていません | 書き込みには再試行可能な書き込みフィールドが含まれていましたが、エンジンバージョンは再試行可能な書き込みをサポートしていないか、オペレーションは再試行できません。8.0.2 より前のエンジンバージョンに接続するretryWrites=falseときに を設定します。 | 

## retryWrites=false からの移行
<a name="retryable-writes-migration"></a>

エンジンバージョン 8.0.2 にアップグレードし、現在接続文字列`retryWrites=false`で を使用している場合:

1. クラスターをエンジンバージョン 8.0.2 以降にアップグレードします。

1. アプリケーションの接続文字列`retryWrites=false`から を削除するか、 に変更します`retryWrites=true`。

1. アプリケーションコードの変更は必要ありません。ドライバーは再試行を自動的に処理します。