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にカウントされることを忘れずに。

修正方法

  1. それぞれ100アクション以下の 複数のトランザクションに分割します — 各トランザクションは独立して原子的である(まとめてロールバックはされない)ことに注意してください。
  2. そもそもトランザクションが必要か考え直します — 書き込みにオール・オア・ナッシングのセマンティクスが不要なら、BatchWriteItem(1回あたり25件以下)の方が安く、スループットにも優しいです。
  3. アクション数を減らします — 1つのアイテムへの複数の変更を、結合した UpdateExpression を持つ1つの Update にまとめます。
  4. 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 に接続するインストールを参照してください。

出典

関連するエラー

参考資料

最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

2026-07-26 に DynamoDB Local 2.x と AWS SDK for JavaScript v3.1095.0 で再現しました — 上記の出力はそのままの逐語です。

Console なしで DynamoDB を扱う

DynamoDB では実行できない本物の SQL(JOINs、GROUP BY、集計)を実行する高速な DynamoDB デスクトップクライアント。ビジュアル編集と、あなた自身の Bedrock キーで動く AI エージェントを備えています。

30日間無料トライアル、クレジットカード不要 — その後は期限のない Free プラン。