TransactionInProgressException

TL;DR — Un nuovo tentativo TransactWriteItems conteneva lo stesso ClientRequestToken di un tentativo che è ancora in esecuzione. Di solito si tratta del timeout del client più veloce del completamento della transazione, quindi il nuovo tentativo dell'SDK entra in conflitto con l'originale in corso. Continua a riprovare con il backoff (un secondo tentativo al termine dell'originale restituisce il successo idempotente) e regola i timeout in modo che almeno un tentativo venga effettuato dopo circa 5 secondi.

Cosa significa

TransactionInProgressException: The transaction with the given request token
is already in progress.

"ClientRequestToken" rende "TransactWriteItems" idempotente: chiamate identiche all'interno di una finestra di 10 minuti contano come una transazione. Mentre il primo tentativo è ancora in fase di elaborazione, non è ancora possibile rispondere a una seconda chiamata con lo stesso token — non è né un duplicato di una transazione completata né una nuova — quindi DynamoDB la rifiuta con questa eccezione. È un segnale di temporizzazione, non un errore di dati.

Perché succede

  • Timeout del client più breve della latenza della transazione: il timeout della richiesta si attiva, l'SDK riprova e il nuovo tentativo arriva mentre è ancora in corso il commit della transazione originale.
  • Politica aggressiva sui nuovi tentativi: un backoff molto breve significa che diversi tentativi possono accumularsi su una transazione che richiede pochi secondi.
  • Due chiamanti che condividono un token: processi separati deliberatamente (o accidentalmente) emettendo lo stesso ClientRequestToken contemporaneamente.

Come risolverlo

  1. Lascia che i tentativi continuino con un backoff esponenziale: una volta completata la transazione in volo, un tentativo con lo stesso token restituisce successo senza applicare le scritture due volte. Considera questa eccezione come riprovabile.

  2. Regolare i timeout in base alle linee guida documentate in modo che sia possibile effettuare un nuovo tentativo una volta completata la transazione:

    • consentire l'elaborazione di almeno un tentativo trascorsi 5 secondi dal primo tentativo;
    • imposta il timeout per richiesta su 1 secondo o più;
    • mantenere il timeout del socket leggermente inferiore al timeout della richiesta;
    • utilizzare il backoff esponenziale tra i tentativi.
  3. Non ruotare il token al nuovo tentativo: la generazione di un nuovo ClientRequestToken per tentativo converte silenziosamente i tentativi in nuove transazioni (applicando due volte le scritture). Stesso intento, stesso token, per un massimo di 10 minuti:

    const token = randomUUID(); // one token per logical transaction
    await client.send(new TransactWriteItemsCommand({TransactItems, ClientRequestToken: token}));
  4. Serializza chiamanti simultanei intenzionali: se due lavoratori possono inviare la stessa transazione logica, assegnarne uno al proprietario o instradarli entrambi attraverso una coda.

  5. Log token e tempo trascorso per ogni tentativo. La guida di 5 secondi è documentata: i tuoi registri dovrebbero mostrare se i tentativi arrivano troppo presto.

Percorso in DynoTable

Ispeziona gli elementi toccati da una transazione lunga prima di regolare i timeout: aprili con ⌘K e conferma che non vi siano conflitti di tasti di scelta rapida da parte di autori paralleli. La gestione temporanea (⌘S) ti consente di riprodurre prima una transazione più piccola rispetto ai dati di sviluppo.

Stimare il costo di scrittura transazionale con il calcolatore dei prezzi. Cambia profilo con ⌘P; Verifica connessione in Impostazioni → Profili. Consulta Connetti a AWS e Installa.

Fonti

Errori correlati

Riferimenti

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

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.