Transaction request cannot include multiple operations on one item

TL;DR — 同一個 TransactWriteItems 請求中的兩個操作指向了同一個項目(相同的主索引鍵)。DynamoDB 要求一個事務中的每個項目都唯一,因此它在執行任何操作之前就拒絕了整個呼叫。把重複的操作合併成一個,或者把其中一個移到一次單獨的寫入。

這是什麼意思

ValidationException: Transaction request cannot include multiple operations on one item

一個 TransactWriteItems 請求把最多 100 個操作(PutUpdateDeleteConditionCheck)分組,它們要麼全部提交要麼全部失敗。那個 API 的一條硬性規則是沒有兩個操作能指向同一個項目——DynamoDB 用完整的主索引鍵來標識一個項目,每個鍵至多出現一次。這是一個 HTTP 400 ValidationException,在事務執行前被捕獲,且原樣不可重試

為什麼會發生

  • 對同一個鍵既 ConditionCheck 又寫入——你試圖在同一個事務中對一個項目斷言一個條件,同時又 Update/Delete 它。改為把條件折進寫入的 ConditionExpression
  • 對同一個鍵的兩次寫入——例如對同一個項目的一次 Put 和一次 Update,常常來自一個不按鍵去重的迴圈。
  • 一個帶重複鍵的生成批次——一個 ORM 或對映層兩次發出了同一個分割區索引鍵+排序索引鍵。
  • 在你_以為_不同的表之間,同一個鍵出現在兩個不同的操作中——項目由 {table, PK, SK} 唯一確定;同一張表內的重複會觸發它。

如何修正

  1. 在構建事務之前按主索引鍵去重——每個 {PK, SK} 只能出現一次。
  2. 把一個 ConditionCheck 合併進它守護的寫入:把斷言放進那個項目自己的 ConditionExpression,而不是新增一個單獨的 ConditionCheck 操作。
  3. 用一個單一的 UpdateExpressionSET/ADD/REMOVE)把兩個改動合併成一個 Update,而不是兩個操作。
  4. 把不可避免的多步邏輯拆分到不同的事務或寫入中,如果這些操作確實無法表達為一個操作。

手工組合多項目事務正是重複鍵溜進來之處。DynoTable 桌面應用按主索引鍵顯示每個項目,因此一個重複的目標在你傳送請求之前就一目瞭然。

先在 DynoTable 中檢查

在構建多項目事務之前,在 DynoTable 中列出目標鍵 — 使用 ⌘K 開啟表,並確認每個主索引鍵在操作列表中是唯一的。暫存 (⌘S) 可讓你在擴大規模之前測試單項交易。使用 Expression Builder 將條件檢查合併到寫入中。使用 ⌘P 切換設定檔案;參見連線 AWS安裝

來源

相關錯誤

參考資料

最後核實於 2026-07-13,依據上方連結的 AWS 官方文件。

不必透過主控台就能操作 DynamoDB

一款快速的 DynamoDB 桌面用戶端,可執行 DynamoDB 無法執行的真正 SQL — JOINs、GROUP BY、聚合 — 並支援視覺化編輯與使用你自己的 Bedrock 金鑰的 AI 代理。

30 天免費試用,無需信用卡 — 之後為無時間限制的免費方案。