DynamoDB IdempotentParameterMismatchException

TL;DR — Anda memanggil TransactWriteItems dengan ClientRequestToken yang sudah digunakan dalam 10 menit terakhir, tetapi sisa permintaan berubah. Token menjanjikan "ini transaksi yang sama, dicoba ulang" — jadi DynamoDB menolak penggunaan ulang token yang payload-nya berbeda. Gunakan ulang token hanya untuk retry yang byte-identik; buat token baru (UUID) untuk setiap transaksi logis baru.

Apa artinya

IdempotentParameterMismatchException: DynamoDB rejected the request because
you retried a request with a different payload but with an idempotent token
that was already used.

ClientRequestToken membuat TransactWriteItems idempoten: beberapa panggilan identik dengan token yang sama memiliki efek satu panggilan, yang melindungi Anda dari menerapkan transaksi dua kali ketika timeout menyembunyikan apakah upaya pertama mendarat. Token tetap valid selama 10 menit setelah permintaan pertama yang menggunakannya selesai. Jika permintaan tiba dalam jendela itu dengan token yang sama tetapi parameter berbeda, DynamoDB tidak dapat memperlakukannya sebagai retry — dan menolak memperlakukannya sebagai transaksi baru juga. HTTP 400, tidak dapat dicoba ulang apa adanya.

Mengapa terjadi

  • Token statis atau di-hard-code — string token yang sama dikirim untuk setiap transaksi, jadi transaksi kedua (berbeda) bertabrakan dengan yang pertama.
  • Token diturunkan dari sesuatu yang terlalu kasar — mis. ID pengguna atau nama tabel, jadi dua transaksi berbeda untuk pengguna yang sama berbagi token.
  • Retry membangun ulang permintaan secara berbeda — timestamp, nilai TTL, atau ID yang dihasilkan di dalam item berubah antara upaya satu dan retry, jadi transaksi "sama" tidak lagi cocok byte-per-byte.
  • Dua jalur kode berbagi sumber token — worker paralel yang di-seed dengan nilai yang sama.

Cara memperbaikinya

  1. Hasilkan token unik per transaksi logis — UUID pada titik di mana transaksi disusun:

    import {randomUUID} from 'node:crypto';
    
    await client.send(new TransactWriteItemsCommand({
      ClientRequestToken: token, // created ONCE per logical transaction
      TransactItems: [...]
    }));
  2. Jaga token bersama permintaan saat mencoba ulang — coba lagi objek permintaan yang sudah dibangun yang sama, bukan yang dibangun ulang, agar tidak ada di payload yang dapat menyimpang. (AWS SDK melakukan ini dengan benar untuk retry otomatisnya; bug-nya hampir selalu retry tingkat aplikasi yang menyusun ulang permintaan.)

  3. Pin nilai volatil sebelum menyusun — timestamp dan ID yang dihasilkan harus dihitung sekali dan digunakan ulang pada retry, bukan dievaluasi ulang.

  4. Jangan gunakan ulang token setelah 10 menit mengharapkan idempotensi — melewati jendela permintaan diperlakukan sebagai benar-benar baru dan akan diterapkan lagi.

Aplikasi desktop DynoTable memungkinkan Anda memeriksa item persis yang disentuh transaksi, yang membuat "apakah upaya pertama saya benar-benar mendarat?" menjadi pencarian alih-alih tebakan.

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.