Too many actions in a TransactWriteItems call
TL;DR — DynamoDB のトランザクションは100アクションが上限です。TransactWriteItems(および TransactGetItems)は、100を超える Put/Update/Delete/ConditionCheck アクションを含むリクエストを拒否します。作業を複数のトランザクションに分割してください — あるいは、オール・オア・ナッシングの原子性が不要なら、代わりに BatchWriteItem(1回あたり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 は、すべてがコミットされるかすべてがロールバックされるアクションをまとめますが、1つのトランザクションが保持できるのは最大 100アクション で、トランザクション内のアイテムの合計サイズは 4 MB を超えられません。それ以上を渡すと、DynamoDB は実行前に呼び出し全体を拒否します。メッセージはしばしば TransactItems リストの長さに対する制約のように読めます。HTTP 400 の ValidationException でクライアント側の問題であり、トランザクションを小さくするまでリトライしても無駄です。
発生する理由
- 原子的に多すぎる書き込みをまとめている — 1つのトランザクションで150件の put をコミットしようとしている。
- 1つの
TransactItemsリストに 際限なくアクションを追加するループ。 - 100を超えるファンアウト — 100を超えるアイテムに触れる1つの論理操作を、単一のトランザクションとしてモデル化した。
- 書き込みだけを数えている —
ConditionCheckアクションも100にカウントされることを忘れずに。
修正方法
- それぞれ100アクション以下の 複数のトランザクションに分割します — 各トランザクションは独立して原子的である(まとめてロールバックはされない)ことに注意してください。
- そもそもトランザクションが必要か考え直します — 書き込みにオール・オア・ナッシングのセマンティクスが不要なら、
BatchWriteItem(1回あたり25件以下)の方が安く、スループットにも優しいです。 - アクション数を減らします — 1つのアイテムへの複数の変更を、結合した
UpdateExpressionを持つ1つのUpdateにまとめます。 - 1つの論理的な変更が触れるアイテムが少なくなるよう、集約の設計を変えます。
再現方法
上限を1つ超える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)を使えば、まず小さなトランザクションを試せます。
複数アイテムの更新は式ビルダーで組み立て、同じキーに対する重複したアクションは 1 つの 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 — 1つのトランザクションで同じアイテムを2回対象にした。
- TransactionCanceledException — 有効なトランザクションがコミット時にキャンセルされた。
- Too many items requested for the BatchWriteItem call — 非トランザクションのバッチ制限(25)。
- Code example: TransactWriteItems in Node.js — 出発点にできる、正しいサイズのトランザクション。
- 学習: DynamoDB のトランザクション · バッチ操作
参考資料
- 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 で再現しました — 上記の出力はそのままの逐語です。