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 ClientRequestToken contemporaneamente.

Come correggerlo

  1. 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.

  2. 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.
  3. Non ruotare il token al retry — generare un ClientRequestToken nuovo 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}));
  4. 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

References

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

Lavora con DynamoDB senza la Console

DynoTable è un client desktop veloce per DynamoDB — sfoglia le tabelle, esegui query in stile SQL e modifica gli Item localmente.