TransactionInProgressException

TL;DR — Sebuah retry TransactWriteItems membawa ClientRequestToken yang sama dengan upaya yang masih dijalankan. Ini biasanya klien Anda timeout lebih cepat daripada transaksi selesai, jadi retry SDK bertabrakan dengan original yang sedang berjalan. Terus coba lagi dengan backoff — retry kemudian setelah original selesai mengembalikan sukses idempoten — dan setel timeout agar setidaknya satu retry mendarat setelah ~5 detik.

Apa artinya

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

ClientRequestToken membuat TransactWriteItems idempoten: panggilan identik dalam jendela 10 menit dihitung sebagai satu transaksi. Saat upaya pertama masih diproses, panggilan kedua dengan token yang sama belum dapat dijawab — ia bukan duplikat dari transaksi yang selesai maupun yang baru — jadi DynamoDB menolaknya dengan exception ini. Ini sinyal waktu, bukan kesalahan data.

Mengapa terjadi

  • Timeout klien lebih pendek dari latensi transaksi — timeout permintaan terpicu, SDK mencoba ulang, dan retry tiba saat transaksi original masih di-commit.
  • Kebijakan retry agresif — backoff sangat pendek berarti beberapa retry dapat menumpuk pada transaksi yang butuh beberapa detik.
  • Dua pemanggil berbagi satu token — proses terpisah dengan sengaja (atau tak sengaja) mengeluarkan ClientRequestToken yang sama secara bersamaan.

Cara memperbaikinya

  1. Biarkan retry berlanjut dengan exponential backoff — setelah transaksi yang sedang berjalan selesai, retry dengan token yang sama mengembalikan sukses tanpa menerapkan tulisan dua kali. Perlakukan exception ini sebagai dapat dicoba ulang.

  2. Setel timeout sesuai panduan yang didokumentasikan agar retry dapat mendarat setelah transaksi selesai:

    • izinkan setidaknya satu retry diproses setelah 5 detik berlalu sejak upaya pertama;
    • atur timeout per-permintaan ke sekitar 1 detik atau lebih tinggi;
    • jaga socket timeout sedikit di bawah timeout permintaan;
    • gunakan exponential backoff antar upaya.
  3. Jangan merotasi token pada retry — menghasilkan ClientRequestToken baru per upaya diam-diam mengubah retry menjadi transaksi baru (menerapkan tulisan dua kali). Niat sama, token sama, hingga 10 menit:

    const token = randomUUID(); // one token per logical transaction
    await client.send(new TransactWriteItemsCommand({TransactItems, ClientRequestToken: token}));
  4. Serialisasikan pemanggil bersamaan yang disengaja — jika dua worker dapat mengirim transaksi logis yang sama, buat satu pemiliknya atau arahkan keduanya melalui antrean.

Jika transaksi berjalan cukup lama untuk memicu timeout, periksa apa yang mereka perebutkan — aplikasi desktop DynoTable memungkinkan Anda memeriksa item yang terlibat, dan kalkulator harga DynamoDB menunjukkan berapa biaya write capacity ganda dari tulisan transaksional.

Kesalahan terkait

References

Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.

Bekerja dengan DynamoDB tanpa Console

DynoTable adalah klien desktop yang cepat untuk DynamoDB — jelajahi tabel, jalankan query gaya SQL, dan edit Item secara lokal.