TransactionInProgressException

TL;DR — Percobaan ulang TransactWriteItems membawa ClientRequestToken yang sama dengan percobaan yang masih dijalankan. Ini biasanya waktu tunggu klien Anda lebih cepat daripada penyelesaian transaksi, sehingga percobaan ulang SDK bertabrakan dengan percobaan asli yang sedang berjalan. Teruslah mencoba ulang dengan backoff — percobaan ulang berikutnya setelah penyelesaian asli akan mengembalikan keberhasilan idempoten — dan sesuaikan batas waktu sehingga setidaknya satu percobaan ulang dilakukan setelah ~5 detik.

Apa artinya

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

ClientRequestToken menjadikan TransactWriteItems idempoten: panggilan identik dalam jendela 10 menit dihitung sebagai satu transaksi. Sementara upaya pertama masih diproses, panggilan kedua dengan token yang sama belum dapat dijawab — ini bukan duplikat dari transaksi yang telah selesai atau transaksi baru — jadi DynamoDB menolaknya dengan pengecualian ini. Ini adalah sinyal waktu, bukan kesalahan data.

Mengapa itu terjadi

  • Waktu tunggu klien lebih pendek dari latensi transaksi — waktu tunggu permintaan diaktifkan, percobaan ulang SDK, dan percobaan ulang dilakukan saat transaksi awal masih dilakukan.
  • Kebijakan percobaan ulang yang agresif — backoff yang sangat singkat berarti beberapa percobaan ulang dapat dilakukan dalam satu transaksi yang memerlukan beberapa detik.
  • Dua penelepon berbagi satu token — proses terpisah secara sengaja (atau tidak sengaja) mengeluarkan ClientRequestToken yang sama secara bersamaan.

Bagaimana cara memperbaikinya

  1. Biarkan percobaan ulang dilanjutkan dengan backoff eksponensial — setelah transaksi dalam penerbangan selesai, percobaan ulang dengan token yang sama akan mengembalikan kesuksesan tanpa menerapkan penulisan dua kali. Perlakukan pengecualian ini sebagai pengecualian yang dapat dicoba ulang.

  2. Sesuaikan batas waktu sesuai panduan yang terdokumentasi sehingga percobaan ulang dapat dilakukan setelah transaksi diselesaikan:

    • mengizinkan setidaknya satu percobaan ulang untuk diproses setelah 5 detik berlalu sejak percobaan pertama;
    • atur batas waktu per permintaan menjadi sekitar 1 detik atau lebih tinggi;
    • pertahankan batas waktu soket sedikit di bawah batas waktu permintaan;
    • gunakan backoff eksponensial di antara upaya.
  3. Jangan merotasi token saat mencoba ulang — menghasilkan ClientRequestToken baru setiap upaya secara diam-diam mengubah percobaan ulang menjadi transaksi baru (menerapkan penulisan dua kali). Niat yang sama, token yang sama, hingga 10 menit:

    const token = randomUUID(); // one token per logical transaction
    await client.send(new TransactWriteItemsCommand({TransactItems, ClientRequestToken: token}));
  4. Serialkan pemanggil serentak yang disengaja — jika dua worker dapat mengirimkan transaksi logis yang sama, jadikan salah satunya pemilik atau arahkan keduanya melalui antrean.

  5. Catat token dan waktu yang berlalu pada setiap percobaan ulang. Panduan 5 detik itu terdokumentasi — log Anda akan menunjukkan apakah percobaan ulang datang terlalu dini.

Jalur di DynoTable

Periksa item yang disentuh transaksi panjang sebelum Anda menyetel batas waktu — buka item tersebut dengan ⌘K dan pastikan tidak ada pertentangan hot-key dari penulis paralel. Staging (⌘S) memungkinkan Anda memutar ulang transaksi yang lebih kecil terhadap data pengembang terlebih dahulu.

Perkirakan biaya penulisan transaksional dengan kalkulator harga. Ganti profil dengan ⌘P; Uji Koneksi pada Pengaturan → Profil. Lihat Menghubungkan ke AWS dan Instal.

Sumber

Kesalahan terkait

Referensi

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

Bekerja dengan DynamoDB tanpa Console

Klien desktop DynamoDB yang cepat dan menjalankan SQL sungguhan yang tidak bisa dijalankan DynamoDB — JOINs, GROUP BY, agregasi — dengan editing visual dan agen AI pada kunci Bedrock milik Anda sendiri.

Uji coba gratis 30 hari, tanpa kartu kredit — lalu paket Free tanpa batas waktu.