TransactionInProgressException
In breve — Un retry di TransactWriteItems portava lo stesso ClientRequestToken di un tentativo che è ancora in esecuzione. Questo di solito è il tuo client che va in timeout più velocemente di quanto la transazione si completi, quindi il retry dell'SDK collide con l'originale in corso. Continua a riprovare con backoff — un retry successivo dopo che l'originale finisce restituisce il successo idempotente — e regola i timeout così almeno un retry atterri dopo ~5 secondi.
Cosa significa
TransactionInProgressException: The transaction with the given request token
is already in progress.ClientRequestToken rende TransactWriteItems idempotente: chiamate identiche entro una finestra di 10 minuti contano come una transazione. Mentre il primo tentativo è ancora in elaborazione, una seconda chiamata con lo stesso token non può ancora ricevere risposta — non è né un duplicato di una transazione completata né una nuova — quindi DynamoDB la rifiuta con questa eccezione. È un segnale di tempistica, non un errore di dati.
Perché accade
- Timeout del client più breve della latenza della transazione — il request timeout scatta, l'SDK riprova, e il retry arriva mentre la transazione originale sta ancora committando.
- Policy di retry aggressiva — un backoff molto breve significa che diversi retry possono accumularsi su una transazione che necessita di qualche secondo.
- Due chiamanti che condividono un token — processi separati che (deliberatamente o accidentalmente) emettono lo stesso
ClientRequestTokencontemporaneamente.
Come correggerlo
Lascia continuare i retry con backoff esponenziale — una volta che la transazione in corso si completa, un retry con lo stesso token restituisce successo senza applicare le scritture due volte. Tratta questa eccezione come ripetibile.
Regola i timeout secondo la guida documentata così un retry possa atterrare dopo che la transazione si stabilizza:
- consenti che almeno un retry venga elaborato dopo che sono trascorsi 5 secondi dal primo tentativo;
- imposta il timeout per-richiesta a circa 1 secondo o superiore;
- mantieni il socket timeout leggermente sotto il request timeout;
- usa il backoff esponenziale tra i tentativi.
Non ruotare il token al retry — generare un
ClientRequestTokennuovo per tentativo converte silenziosamente i retry in nuove transazioni (applicando le scritture due volte). Stesso intento, stesso token, per fino a 10 minuti:const token = randomUUID(); // one token per logical transaction await client.send(new TransactWriteItemsCommand({TransactItems, ClientRequestToken: token}));Serializza i chiamanti concorrenti deliberati — se due worker possono inviare la stessa transazione logica, rendine uno l'owner o instrada entrambi attraverso una coda.
Se le transazioni durano abbastanza a lungo da far scattare i timeout, controlla su cosa competono — l'app desktop DynoTable ti permette di ispezionare gli Item coinvolti, e il calcolatore dei prezzi DynamoDB mostra quanto costa la capacità di scrittura raddoppiata delle scritture transazionali.
Errori correlati
- IdempotentParameterMismatchException — stesso token, payload diverso.
- TransactionCanceledException — la transazione stessa è fallita.
- TransactionConflictException — conflitto a livello di Item con un'altra transazione.
- Esempio di codice: TransactWriteItems in Node.js — mostra l'uso di ClientRequestToken.
- Impara: DynamoDB transactions
References
- TransactWriteItems — Amazon DynamoDB API Reference
- Amazon DynamoDB Transactions: How it works — Amazon DynamoDB Developer Guide
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
Ultima verifica 2026-07-13 rispetto alla documentazione ufficiale AWS collegata sopra.