Too many actions in a TransactWriteItems call

TL;DR — Une transaction DynamoDB est plafonnée à 100 actions. TransactWriteItems (et TransactGetItems) rejettent une requête comptant plus de 100 actions Put/Update/Delete/ConditionCheck. Répartis le travail en plusieurs transactions — ou, si tu n'as pas besoin de l'atomicité tout-ou-rien, utilise plutôt BatchWriteItem (25 par appel).

Ce que ça signifie

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

Le service recopie toute ta requête sérialisée à l'emplacement de <your request> — pour une transaction de 101 actions, cela fait environ 65 000 caractères. Le constat est la dernière phrase.

TransactWriteItems regroupe des actions qui commitent toutes ou reviennent toutes en arrière ensemble, mais une seule transaction ne peut contenir au plus que 100 actions, et la taille agrégée des éléments de la transaction ne peut pas dépasser 4 Mo. Passe-en davantage et DynamoDB rejette l'appel entier avant l'exécution. Le message se lit souvent comme une contrainte sur la longueur de la liste TransactItems. C'est une ValidationException HTTP 400, côté client, et non réessayable tant que la transaction n'est pas plus petite.

Pourquoi ça arrive

  • Regrouper trop d'écritures atomiquement — essayer de commiter 150 puts en une transaction.
  • Une boucle qui ajoute des actions sans limite à une seule liste TransactItems.
  • Un fan-out dépassant 100 — une opération logique qui touche plus de 100 éléments et a été modélisée comme une seule transaction.
  • Ne compter que les écritures — souviens-toi que les actions ConditionCheck comptent aussi dans les 100.

Comment le corriger

  1. Répartis en plusieurs transactions de ≤ 100 actions chacune — en notant que chaque transaction est atomique indépendamment (elles ne reviennent pas en arrière ensemble).
  2. Reconsidère si tu as besoin d'une transaction tout court — si les écritures ne requièrent pas de sémantique tout-ou-rien, BatchWriteItem (≤ 25 par appel) est moins cher et plus favorable au débit.
  3. Réduis le nombre d'actions — regroupe plusieurs mutations d'un même élément en un seul Update avec une UpdateExpression combinée.
  4. Modélise l'agrégat différemment pour qu'un seul changement logique touche moins d'éléments.

Reproduire l'erreur

Une transaction de 101 actions, une de trop. Le rejet est une simple ValidationException sur la longueur du tableau, pas une erreur propre aux transactions :

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}));

Sortie réelle :

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

Note la formulation : DynamoDB rejette ça comme une contrainte de longueur sur le tableau TransactItems, donc la chaîne que tu obtiens ne mentionne pas du tout les transactions. Chercher le message seul ne te mènera pas ici de façon évidente.

Workbench DynoTable

Avant de valider plus de 100 écritures de façon atomique, inspecte les éléments cibles dans DynoTable — ouvre la table avec ⌘K et confirme que chaque clé existe. Le staging (⌘S) te laisse d'abord tester une transaction plus petite.

Construis tes mises à jour multi-éléments dans l'Expression Builder et fusionne les actions en double sur une même clé en un seul Update. Change de profil avec ⌘P ; vois Se connecter à AWS et Installation.

Sources

Erreurs liées

Références

Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.

Reproduit le 2026-07-26 sur DynamoDB Local 2.x avec l'AWS SDK for JavaScript v3.1095.0 — la sortie ci-dessus est reproduite telle quelle.

Travaille avec DynamoDB sans la Console

Un client de bureau rapide pour DynamoDB qui exécute le vrai SQL que DynamoDB ne peut pas — JOINs, GROUP BY, agrégations — avec édition visuelle et un agent IA sur tes propres clés Bedrock.

Essai gratuit de 30 jours, sans carte bancaire — ensuite la formule Gratuit, sans limite de durée.