DynamoDB TransactionConflictException
TL;DR — 別のトランザクションがすでにあなたのリクエストと同じアイテムを操作しているため、DynamoDB は分離を保つためにあなたのものを拒否しました。これはデータのバグではなく 一時的な競合 です。指数バックオフで再試行し、トランザクションを小さく保ち、同じホットアイテムへの並行書き込みを減らしてください。
意味
TransactionConflictException: Transaction is ongoing for the itemDynamoDB は、進行中のトランザクションに対して競合する書き込みを直列化します。素の PutItem、UpdateItem、または DeleteItem が、同じアイテムを含む 進行中の TransactWriteItems と衝突すると、この例外に遭遇します。ブロックする代わりに、DynamoDB は単一アイテムの書き込みを TransactionConflictException(HTTP 400)で拒否します。リトライ可能 です。他のトランザクションがコミットまたはアボートすると競合は解消されます。
TransactionCanceledException との区別に注意してください: 負けたリクエスト自体が TransactWriteItems または TransactGetItems の場合、DynamoDB はそのトランザクション全体をキャンセルします。この例外ではなく、CancellationReasons がアイテムごとの理由コードとして TransactionConflict を運ぶ キャンセル を得ます。
発生する理由
- 同じアイテムへの並行書き込み — 素の
PutItem/UpdateItemが、そのアイテムに触れる進行中のTransactWriteItemsと重なる。 - アイテムを共有する2つのトランザクション — 2つの
TransactWriteItemsリクエストが同時に同じキーを含む。一方が勝ち、他方はTransactionConflict理由コードでキャンセルされる(TransactionCanceledExceptionとして現れる)。 - 重い並行更新の下のホットアイテム — 例: 共有カウンターや、すべてのリクエストが更新する単一の集約行。
- 他のライターと重なるほど長くアイテムを保持する 長いまたは大きなトランザクション。
- リトライストーム — バックオフなしのリトライが、同じ競合するアイテムにさらに並行試行を積み上げる。
修正方法
- 指数バックオフ + ジッターで再試行します。 これが主要な修正です。競合は一時的で、他のトランザクションが落ち着くと解消されます。リトライが別の衝突に再同期しないようジッターを保ちます。
- トランザクションを小さく短く保ちます —
TransactWriteItemsあたりのアイテムが少ないほど、保持が短くなり重なりが減ります。 - ホットアイテムの競合を減らします — ホットカウンターを複数のアイテムにシャーディングして集約するか、オールオアナッシングのセマンティクスが不要なとき、トランザクションの代わりに素の
UpdateItem(ADD)による アトミックカウンター を使います。 - 避けられるなら、同じアイテムに対してトランザクションと素の書き込みを並行して混在させないでください — 両方を同じ経路でルーティングします。
- 競合が上昇しているか、どこでかを見るため
TransactionConflictCloudWatch メトリクスを監視します。
並行ライターがあなた自身のとき — アプリが同じテーブルに書き込んでいる最中にアイテムを手作業で編集しているとき — DynoTable のステージングエリアは、手作業の編集を、重なり合う単一アイテム書き込みの連続ではなく、まとめて確認してコミットする 1 つのトランザクション書き込みにバッチします。
DynoTable で調べる
同時に書き込んでいるのが自分自身なら、手作業の編集はステージング(⌘S)でまとめましょう — DynoTable は、重なり合う単一アイテムの更新を連発するのではなく、レビュー済みの 1 回の書き込みとしてコミットします。競合しているアイテムは ⌘K で開き、リトライの前に現在の状態を確認してください。
トランザクションのトラフィックは料金計算ツールで見積もりましょう。プロファイルの切り替えは ⌘P、Settings → Profiles では Test Connection を実行します。AWS に接続するとインストールを参照してください。
出典
- Amazon DynamoDB Transactions: How it works (2026-07-13 時点で検証)
- PutItem — Amazon DynamoDB API Reference (2026-07-13 時点で検証)
よくある質問
DynamoDB で TransactionConflictException を修正するには? 指数バックオフとジッターでリクエストを再試行します。競合は、同じアイテムへの別の進行中トランザクションとの一時的な競合です。また、トランザクションを小さく保ち、ホットアイテムをシャーディングし、同じアイテムに対してトランザクションと素の書き込みを並行して実行するのを避けます。
TransactionConflictException は TransactionCanceledException と同じですか? いいえ。TransactionConflictException は、別のトランザクションが現在アイテムを操作していることを意味します。TransactionCanceledException は、トランザクション全体がロールバックされたことを意味します。その CancellationReasons が理由を説明し、トランザクションの競合はその理由の1つになり得ます。
関連するエラー
- TransactionCanceledException — トランザクション全体がロールバックされた(条件、キャパシティ、または競合)。
- ConditionalCheckFailedException — 単一の書き込みの条件が失敗した。
- Code example: TransactWriteItems in Node.js — 適応可能なリトライ/バックオフ付きのトランザクション。
- 学習: DynamoDB のトランザクション · アトミックカウンター
参考資料
- Amazon DynamoDB Transactions: How it works — Amazon DynamoDB Developer Guide
- PutItem — Amazon DynamoDB API Reference
- TransactWriteItems — Amazon DynamoDB API Reference
- DynamoDB metrics and dimensions — Amazon DynamoDB Developer Guide
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。