Transaction request cannot include multiple operations on one item

TL;DR — 同じ TransactWriteItems リクエスト内の2つのアクションが、同じアイテム(同じプライマリキー)を対象としています。DynamoDB はトランザクション内のすべてのアイテムが一意であることを要求するため、いずれかを実行する前に呼び出し全体を拒否します。重複するアクションを1つにまとめるか、一方を別の書き込みに移してください。

意味

ValidationException: Transaction request cannot include multiple operations on one item

TransactWriteItems リクエストは、すべてがコミットするかすべてが失敗する最大 100 個のアクション(PutUpdateDeleteConditionCheck)をグループ化します。その API の厳格なルールは、2つのアクションが同じアイテムを対象にできない ことです。DynamoDB はアイテムをその完全なプライマリキーで識別し、各キーは最大 1 回しか現れることができません。これは HTTP 400 の ValidationException で、トランザクションが実行される前に捕捉され、そのままでは リトライ不可 です。

発生する理由

  • 同じキーへの ConditionCheck と書き込み — アイテムに条件をアサートし、同じトランザクションで Update/Delete もしようとした。代わりに条件を書き込みの ConditionExpression に折り込みます。
  • 同じキーへの2つの書き込み — 例: 同じアイテムへの PutUpdate。多くの場合キーで重複排除しないループから。
  • 重複キーを持つ生成されたバッチ — ORM やマッピング層が同じパーティション + ソートキーを2回出力した。
  • 異なると 思っている テーブルにまたがる2つの異なるアクションでの同じキー — アイテムは一意に {table, PK, SK} です。同じテーブル内での繰り返しがこれを引き起こします。

修正方法

  1. トランザクションを組み立てる前に プライマリキーで重複排除します — 各 {PK, SK} は 1 回現れることができます。
  2. ConditionCheck を、それがガードする書き込みにマージします: 別の ConditionCheck アクションを追加するのではなく、そのアイテム自身の ConditionExpression にアサーションを置きます。
  3. 2つの変更を1つの Update に結合します — 2つのアクションの代わりに、単一の UpdateExpressionSET/ADD/REMOVE)を使います。
  4. 操作が本当に1つのアクションとして表現できない場合は、避けられない複数ステップのロジックを 別々のトランザクションや書き込みに分割します。

複数アイテムのトランザクションを手作業で組み立てるところに重複キーが忍び込みます。DynoTable デスクトップアプリ は各アイテムをそのプライマリキーで表示するため、リクエストを送る前に繰り返された対象が明白になります。

まず DynoTable で確認

複数アイテムのトランザクションを組む前に、対象のキーを DynoTable で一覧しましょう — ⌘K でテーブルを開き、アクションのリストの中で各プライマリキーが一意であることを確認します。ステージング(⌘S)を使えば、規模を広げる前に単一アイテムのトランザクションを試せます。

条件チェックを書き込みにまとめるには、式ビルダーを使いましょう。プロファイルの切り替えは ⌘P です。AWS に接続するインストールを参照してください。

出典

関連するエラー

参考資料

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

Console なしで DynamoDB を扱う

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

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