Too many actions in a TransactWriteItems call

TL;DR — 一次 DynamoDB 事務最多 100 個動作。TransactWriteItems(以及 TransactGetItems)會拒絕超過 100 個 Put/Update/Delete/ConditionCheck 動作的請求。把工作拆成多個事務——或者,如果你並不需要全有或全無的原子性,改用 BatchWriteItem(每次呼叫 25 個)。

這是什麼意思

ValidationException: 1 validation error detected: Value '<your request>' at 'transactItems' failed to satisfy constraint: Member must have length less than or equal to 100

服務會在 <your request> 所在的位置原樣回顯你整個序列化後的請求——對於一個 101 個動作的事務,那大約是 65,000 個字元。真正的結論在最後一句。

TransactWriteItems 把一組要麼全部提交、要麼一起回滾的動作聚在一起,但單個事務最多隻能裝 100 個動作,並且事務中各項目的總大小不能超過 4 MB。傳得更多,DynamoDB 會在執行之前就拒絕整次呼叫。這條訊息讀起來往往像是在說 TransactItems 列表長度的約束。它是 HTTP 400 ValidationException,發生在用戶端一側,在事務變小之前不可重試。

為什麼會發生

  • 想原子性地批次寫太多東西——試圖在一個事務裡提交 150 次 put。
  • 一個迴圈無節制地往單個 TransactItems 列表裡追加動作
  • 扇出超過了 100——一次邏輯操作觸及超過 100 個項目,卻被建模成了單個事務。
  • 只數了寫入——記住 ConditionCheck 動作也計入那 100 個。

如何修正

  1. 拆成多個事務,每個 ≤100 個動作——但要注意每個事務各自獨立地保證原子性(它們不會一起回滾)。
  2. 重新想想你到底需不需要事務——如果這些寫入並不要求全有或全無的語義,BatchWriteItem(每次呼叫 ≤25 個)更便宜,也對吞吐更友好。
  3. 減少動作數量——把對同一個項目的多次改動摺疊成一次帶合併 UpdateExpressionUpdate
  4. 換一種方式給聚合建模,讓一次邏輯變更觸及更少的項目。

重現方式

一筆交易有 101 個操作,其中一個操作超出限制。拒絕是陣列長度上的普通 ValidationException,而不是特定於交易的錯誤:

const actions = Array.from({length: 101}, (_, i) => ({
  Put: {TableName: 'orders', Item: {pk: {S: `T#${i}`}, sk: {S: 'META'}}}
}));
await client.send(new TransactWriteItemsCommand({TransactItems: actions}));

實際輸出:

ValidationException: Member must have length less than or equal to 100
HTTP 400

請注意措辭:DynamoDB拒絕將此作為TransactItems陣列長度約束,因此你得到的字串根本不包含任何交易。僅搜尋該訊息顯然不會將你帶到這裡。

DynoTable 工作臺

在以原子方式提交 100 多個寫入之前,檢查 DynoTable 中的目標項 — 使用 ⌘K 開啟表並確認每個鍵都存在。暫存 (⌘S) 可讓你首先測試較小的交易。在 Expression Builder 中構建多項目更新,並將一個鍵上的重複操作摺疊到單個 Update 中。使用 ⌘P 切換設定檔案;參見連線 AWS安裝

來源

相關錯誤

參考資料

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

2026-07-26 針對 DynamoDB Local 2.x 與 AWS SDK for JavaScript v3.1095.0 復現——上方輸出為原樣照錄。

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

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

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