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 個。
如何修正
- 拆成多個事務,每個 ≤100 個動作——但要注意每個事務各自獨立地保證原子性(它們不會一起回滾)。
- 重新想想你到底需不需要事務——如果這些寫入並不要求全有或全無的語義,
BatchWriteItem(每次呼叫 ≤25 個)更便宜,也對吞吐更友好。 - 減少動作數量——把對同一個項目的多次改動摺疊成一次帶合併
UpdateExpression的Update。 - 換一種方式給聚合建模,讓一次邏輯變更觸及更少的項目。
重現方式
一筆交易有 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和安裝。
來源
- TransactWriteItems — Amazon DynamoDB API Reference(2026-07-13 驗證)
- Amazon DynamoDB Transactions: How it works(2026-07-13 驗證)
相關錯誤
- Transaction request cannot include multiple operations on one item——同一個項目在一個事務裡被指向了兩次。
- TransactionCanceledException——一個合法的事務在提交時被取消。
- Too many items requested for the BatchWriteItem call——非事務批次的限制(25)。
- 程式碼示例:TransactWriteItems in Node.js——一個大小正確、可以作為起點的事務。
- 學習:DynamoDB transactions · Batch operations
參考資料
- TransactWriteItems — Amazon DynamoDB API Reference
- TransactGetItems — Amazon DynamoDB API Reference
- Amazon DynamoDB Transactions: How it works — Amazon DynamoDB Developer Guide
- BatchWriteItem — Amazon DynamoDB API Reference
- Service, account, and table quotas in Amazon DynamoDB — Amazon DynamoDB Developer Guide
最後核實於 2026-07-13,依據上方連結的 AWS 官方文件。
2026-07-26 針對 DynamoDB Local 2.x 與 AWS SDK for JavaScript v3.1095.0 復現——上方輸出為原樣照錄。