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 個操作(Put、Update、Delete、ConditionCheck)分組,它們要麼全部提交要麼全部失敗。那個 API 的一條硬性規則是沒有兩個操作能指向同一個項目——DynamoDB 用完整的主索引鍵來標識一個項目,每個鍵至多出現一次。這是一個 HTTP 400 ValidationException,在事務執行前被捕獲,且原樣不可重試。
為什麼會發生
- 對同一個鍵既
ConditionCheck又寫入——你試圖在同一個事務中對一個項目斷言一個條件,同時又Update/Delete它。改為把條件折進寫入的ConditionExpression。 - 對同一個鍵的兩次寫入——例如對同一個項目的一次
Put和一次Update,常常來自一個不按鍵去重的迴圈。 - 一個帶重複鍵的生成批次——一個 ORM 或對映層兩次發出了同一個分割區索引鍵+排序索引鍵。
- 在你_以為_不同的表之間,同一個鍵出現在兩個不同的操作中——項目由
{table, PK, SK}唯一確定;同一張表內的重複會觸發它。
如何修正
- 在構建事務之前按主索引鍵去重——每個
{PK, SK}只能出現一次。 - 把一個
ConditionCheck合併進它守護的寫入:把斷言放進那個項目自己的ConditionExpression,而不是新增一個單獨的ConditionCheck操作。 - 用一個單一的
UpdateExpression(SET/ADD/REMOVE)把兩個改動合併成一個Update,而不是兩個操作。 - 把不可避免的多步邏輯拆分到不同的事務或寫入中,如果這些操作確實無法表達為一個操作。
手工組合多項目事務正是重複鍵溜進來之處。DynoTable 桌面應用按主索引鍵顯示每個項目,因此一個重複的目標在你傳送請求之前就一目瞭然。
先在 DynoTable 中檢查
在構建多項目事務之前,在 DynoTable 中列出目標鍵 — 使用 ⌘K 開啟表,並確認每個主索引鍵在操作列表中是唯一的。暫存 (⌘S) 可讓你在擴大規模之前測試單項交易。使用 Expression Builder 將條件檢查合併到寫入中。使用 ⌘P 切換設定檔案;參見連線 AWS和安裝。
來源
- TransactWriteItems — Amazon DynamoDB API Reference(2026-07-13 驗證)
- Amazon DynamoDB Transactions: How it works(2026-07-13 驗證)
相關錯誤
- TransactionCanceledException——事務解析了,但一個條件或衝突在提交時取消了它。
- Too many items in a TransactWriteItems call——一個事務中超過 100 個操作。
- ValidationException (overview)
- 程式碼示例:TransactWriteItems in Node.js——一個可改用的有效多項目事務。
- 學習:DynamoDB transactions
參考資料
- TransactWriteItems — Amazon DynamoDB API Reference
- Amazon DynamoDB Transactions: How it works — Amazon DynamoDB Developer Guide
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
最後核實於 2026-07-13,依據上方連結的 AWS 官方文件。