DynamoDB TransactionConflictException

TL;DR — 別のトランザクションがすでにあなたのリクエストと同じアイテムを操作しているため、DynamoDB は分離を保つためにあなたのものを拒否しました。これはデータのバグではなく 一時的な競合 です。指数バックオフで再試行し、トランザクションを小さく保ち、同じホットアイテムへの並行書き込みを減らしてください。

意味

TransactionConflictException: Transaction is ongoing for the item

DynamoDB は、進行中のトランザクションに対して競合する書き込みを直列化します。素の PutItemUpdateItem、または DeleteItem が、同じアイテムを含む 進行中の TransactWriteItems と衝突すると、この例外に遭遇します。ブロックする代わりに、DynamoDB は単一アイテムの書き込みを TransactionConflictException(HTTP 400)で拒否します。リトライ可能 です。他のトランザクションがコミットまたはアボートすると競合は解消されます。

TransactionCanceledException との区別に注意してください: 負けたリクエスト自体が TransactWriteItems または TransactGetItems の場合、DynamoDB はそのトランザクション全体をキャンセルします。この例外ではなく、CancellationReasons がアイテムごとの理由コードとして TransactionConflict を運ぶ キャンセル を得ます。

発生する理由

  • 同じアイテムへの並行書き込み — 素の PutItem/UpdateItem が、そのアイテムに触れる進行中の TransactWriteItems と重なる。
  • アイテムを共有する2つのトランザクション — 2つの TransactWriteItems リクエストが同時に同じキーを含む。一方が勝ち、他方は TransactionConflict 理由コードでキャンセルされる(TransactionCanceledException として現れる)。
  • 重い並行更新の下のホットアイテム — 例: 共有カウンターや、すべてのリクエストが更新する単一の集約行。
  • 他のライターと重なるほど長くアイテムを保持する 長いまたは大きなトランザクション
  • リトライストーム — バックオフなしのリトライが、同じ競合するアイテムにさらに並行試行を積み上げる。

修正方法

  1. 指数バックオフ + ジッターで再試行します。 これが主要な修正です。競合は一時的で、他のトランザクションが落ち着くと解消されます。リトライが別の衝突に再同期しないようジッターを保ちます。
  2. トランザクションを小さく短く保ちますTransactWriteItems あたりのアイテムが少ないほど、保持が短くなり重なりが減ります。
  3. ホットアイテムの競合を減らします — ホットカウンターを複数のアイテムにシャーディングして集約するか、オールオアナッシングのセマンティクスが不要なとき、トランザクションの代わりに素の UpdateItemADD)による アトミックカウンター を使います。
  4. 避けられるなら、同じアイテムに対してトランザクションと素の書き込みを並行して混在させないでください — 両方を同じ経路でルーティングします。
  5. 競合が上昇しているか、どこでかを見るため TransactionConflict CloudWatch メトリクスを監視します

並行ライターがあなた自身のとき — アプリが同じテーブルに書き込んでいる最中にアイテムを手作業で編集しているとき — DynoTable のステージングエリアは、手作業の編集を、重なり合う単一アイテム書き込みの連続ではなく、まとめて確認してコミットする 1 つのトランザクション書き込みにバッチします。

DynoTable で調べる

同時に書き込んでいるのが自分自身なら、手作業の編集はステージング(⌘S)でまとめましょう — DynoTable は、重なり合う単一アイテムの更新を連発するのではなく、レビュー済みの 1 回の書き込みとしてコミットします。競合しているアイテムは ⌘K で開き、リトライの前に現在の状態を確認してください。

トランザクションのトラフィックは料金計算ツールで見積もりましょう。プロファイルの切り替えは ⌘P、Settings → Profiles では Test Connection を実行します。AWS に接続するインストールを参照してください。

出典

よくある質問

DynamoDB で TransactionConflictException を修正するには? 指数バックオフとジッターでリクエストを再試行します。競合は、同じアイテムへの別の進行中トランザクションとの一時的な競合です。また、トランザクションを小さく保ち、ホットアイテムをシャーディングし、同じアイテムに対してトランザクションと素の書き込みを並行して実行するのを避けます。

TransactionConflictException は TransactionCanceledException と同じですか? いいえ。TransactionConflictException は、別のトランザクションが現在アイテムを操作していることを意味します。TransactionCanceledException は、トランザクション全体がロールバックされたことを意味します。その CancellationReasons が理由を説明し、トランザクションの競合はその理由の1つになり得ます。

関連するエラー

参考資料

最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

Console なしで DynamoDB を扱う

DynamoDB では実行できない本物の SQL(JOINs、GROUP BY、集計)を実行する高速な DynamoDB デスクトップクライアント。ビジュアル編集と、あなた自身の Bedrock キーで動く AI エージェントを備えています。

30日間無料トライアル、クレジットカード不要 — その後は期限のない Free プラン。