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
ClientRequestTokenyang sama secara bersamaan.
Cara memperbaikinya
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.
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.
Jangan merotasi token pada retry — menghasilkan
ClientRequestTokenbaru 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}));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
- IdempotentParameterMismatchException — token sama, payload berbeda.
- TransactionCanceledException — transaksi itu sendiri gagal.
- TransactionConflictException — konflik tingkat-item dengan transaksi lain.
- Contoh kode: TransactWriteItems in Node.js — menunjukkan penggunaan ClientRequestToken.
- Pelajari: 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
Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.