Transaction request cannot include multiple operations on one item
TL;DR — Deux actions dans le même appel TransactWriteItems ciblent le même élément (même clé primaire). DynamoDB exige que chaque élément d'une transaction soit unique, donc il rejette l'appel entier avant d'en exécuter la moindre partie. Fusionne les actions en double en une seule, ou déplace l'une d'elles vers une écriture séparée.
Ce que ça signifie
ValidationException: Transaction request cannot include multiple operations on one itemUne requête TransactWriteItems regroupe jusqu'à 100 actions (Put, Update, Delete, ConditionCheck) qui commitent toutes ou échouent toutes. Une règle stricte de cette API est qu'aucune paire d'actions ne peut cibler le même élément — DynamoDB identifie un élément par sa clé primaire complète, et chaque clé ne peut apparaître au plus qu'une fois. C'est une ValidationException HTTP 400, détectée avant l'exécution de la transaction, et elle n'est pas réessayable telle quelle.
Pourquoi ça arrive
- Un
ConditionCheckplus une écriture sur la même clé — tu as essayé d'affirmer une condition sur un élément et aussi de l'Update/Deletedans la même transaction. Intègre plutôt la condition dans laConditionExpressionde l'écriture. - Deux écritures sur la même clé — par exemple un
Putet unUpdatepour le même élément, souvent issus d'une boucle qui ne déduplique pas par clé. - Un lot généré avec des clés en double — un ORM ou une couche de mapping a émis deux fois la même clé de partition + clé de tri.
- La même clé dans deux actions différentes sur des tables que tu crois différentes — l'élément est identifié de façon unique par
{table, PK, SK}; une répétition au sein de la même table le déclenche.
Comment le corriger
- Déduplique par clé primaire avant de construire la transaction — chaque
{PK, SK}ne peut apparaître qu'une fois. - Fusionne un
ConditionCheckdans l'écriture qu'il protège : mets l'assertion dans la propreConditionExpressionde cet élément plutôt que d'ajouter une actionConditionCheckséparée. - Combine deux mutations en un seul
Updateà l'aide d'une seuleUpdateExpression(SET/ADD/REMOVE) au lieu de deux actions. - Sépare la logique multi-étapes inévitable en transactions ou écritures distinctes si les opérations ne peuvent vraiment pas s'exprimer en une seule action.
Composer des transactions multi-éléments à la main, c'est là que les clés en double se glissent. L'application de bureau DynoTable affiche chaque élément par sa clé primaire, pour qu'une cible répétée saute aux yeux avant l'envoi de la requête.
Vérifie d’abord dans DynoTable
Avant de construire une transaction multi-éléments, liste les clés cibles dans DynoTable — ouvre la table avec ⌘K et confirme que chaque clé primaire n'apparaît qu'une fois dans ta liste d'actions. Le staging (⌘S) te laisse tester une transaction sur un seul élément avant de monter en charge.
Fusionne les vérifications de condition dans les écritures avec l'Expression Builder. Change de profil avec ⌘P ; vois Se connecter à AWS et Installation.
Sources
- TransactWriteItems — Amazon DynamoDB API Reference (vérifié le 2026-07-13)
- Amazon DynamoDB Transactions: How it works (vérifié le 2026-07-13)
Erreurs liées
- TransactionCanceledException — la transaction a été analysée mais une condition ou un conflit l'a annulée au commit.
- Too many items in a TransactWriteItems call — plus de 100 actions dans une transaction.
- ValidationException (vue d'ensemble)
- Exemple de code : TransactWriteItems en Node.js — une transaction multi-éléments valide à adapter.
- En savoir plus : Transactions DynamoDB
Références
- TransactWriteItems — Amazon DynamoDB API Reference
- Amazon DynamoDB Transactions: How it works — Amazon DynamoDB Developer Guide
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.