Troppe azioni in una chiamata TransactWriteItems

TL;DR — Una transazione DynamoDB ha un limite di 100 azioni. TransactWriteItems (e TransactGetItems) rifiuta una richiesta con più di 100 azioni Put/Update/Delete/ConditionCheck. Suddividi il lavoro in più transazioni oppure, se non hai bisogno dell'atomicità tutto o niente, utilizza invece BatchWriteItem (25 per chiamata).

Cosa significa

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

Il servizio riproduce l'intera richiesta serializzata in cui si trova "", per una transazione di 101 azioni di circa 65.000 caratteri. La scoperta è l'ultima frase.

"TransactWriteItems" raggruppa le azioni che vengono tutte sottoposte a commit o rollback insieme, ma una singola transazione può contenere al massimo 100 azioni e la dimensione aggregata degli elementi nella transazione non può superare 4 MB. Passane altri e DynamoDB rifiuta l'intera chiamata prima di eseguirla. Il messaggio spesso viene letto come un vincolo sulla lunghezza dell'elenco "TransactItems". Si tratta di una "ValidationException" HTTP 400, lato client, e non è possibile riprovarla fino a quando la transazione non diventa più piccola.

Perché succede

  • Batch di troppe scritture in modo atomico: tentativo di eseguire il commit di 150 put in una transazione.
  • Un ciclo che aggiunge azioni illimitate a un singolo elenco "TransactItems".
  • Fan-out superiore a 100: un'operazione logica che tocca più di 100 elementi ed è stata modellata come una singola transazione.
  • Conteggio solo delle scritture: ricorda che anche le azioni ConditionCheck contano ai fini del conteggio di 100.

Come risolverlo

  1. Diviso in più transazioni di ≤100 azioni ciascuna: ogni transazione è atomica in modo indipendente (non si ripristinano insieme).
  2. Riconsidera se hai bisogno di una transazione: se le scritture non richiedono una semantica tutto o niente, BatchWriteItem (≤25 per chiamata) è più economico e più efficiente in termini di throughput.
  3. Riduci il conteggio delle azioni: raggruppa più mutazioni in un elemento in un singolo "Aggiornamento" con una "UpdateExpression" combinata.
  4. Modella l'aggregato in modo diverso in modo che una singola modifica logica tocchi meno elementi.
  5. Attenzione al limite massimo di 4 MB per la dimensione aggregata degli elementi insieme al limite di 100 azioni: gli elementi di grandi dimensioni possono fallire anche al di sotto delle 100 azioni.

Riproducilo

Una transazione con 101 azioni, una oltre il limite. Il rifiuto è una semplice ValidationException sulla lunghezza dell'array, non un errore specifico della transazione:

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

Produzione reale:

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

Nota la dicitura: DynamoDB lo rifiuta come vincolo di lunghezza sull'array TransactItems, quindi la stringa che ottieni non contiene alcuna menzione delle transazioni. La sola ricerca del messaggio non ti porterà ovviamente qui.

Workbench DynoTable

Prima di eseguire più di 100 scritture atomiche, ispeziona gli elementi di destinazione in DynoTable: apri la tabella con ⌘K e conferma che ciascuna chiave esiste. La gestione temporanea (⌘S) ti consente di testare prima una transazione più piccola.

Crea aggiornamenti con più elementi nel Generatore di espressioni e riunisci le azioni duplicate su una chiave in un singolo "Aggiornamento". Cambia profilo con ⌘P; vedere Connetti a AWS e Installa.

Fonti

Errori correlati

Riferimenti

Ultima verifica il 13-07-2026 rispetto alla documentazione ufficiale del AWS collegata sopra.

Riprodotto il 26-07-2026 rispetto a DynamoDB Local 2.x con AWS SDK per JavaScript v3.1095.0: l'output sopra è letterale.

Lavora con DynamoDB senza la Console

Un client desktop veloce per DynamoDB che esegue il vero SQL che DynamoDB non può — JOINs, GROUP BY, aggregazioni — con modifica visuale e un agente AI sulle tue chiavi Bedrock.

Prova gratuita di 30 giorni, senza carta di credito — poi il piano Free senza limiti di tempo.