DynamoDB TransactionCanceledException — ConditionalCheckFailed

TL;DR — TransactWriteItems Anda dibatalkan dan array CancellationReasons berisi entri ConditionalCheckFailed. Salah satu condition expression transaksi tidak terpenuhi, jadi DynamoDB menggulung balik setiap aksi secara atomik. Baca array reasons — entrinya bersifat posisional, satu per item yang diminta — untuk menemukan kondisi item mana yang gagal, lalu perbaiki prasyarat item itu atau datanya.

Apa artinya

TransactionCanceledException: Transaction cancelled, please refer cancellation
reasons for specific reasons [ConditionalCheckFailed, None, None]
# CancellationReasons[0] = { Code: "ConditionalCheckFailed",
#                            Message: "The conditional request failed" }

TransactWriteItems bersifat semua-atau-tidak-sama-sekali. Jika ConditionExpression dari salah satu aksi bernilai false, DynamoDB membatalkan seluruh permintaan dan melaporkan daftar alasan per item. ConditionalCheckFailed di posisi i berarti kondisi item ke-i tidak terpenuhi — transaksi tidak pernah diterapkan sebagian.

Mengapa terjadi

  • Optimistic-lock meleset — penjaga version = :v / attribute_not_exists(pk) gagal karena penulis lain sudah mengubah atau membuat item.
  • Penjaga keunikan terpicu — sisipan attribute_not_exists(pk) kalah dalam balapan, jadi item sudah ada.
  • Baca usang — kondisi dibangun dari nilai yang sejak itu telah berubah.
  • Daftar alasan salah dibaca — array bersifat posisional, diurutkan seperti TransactItems Anda; None pada suatu slot berarti item itu baik-baik saja, ConditionalCheckFailed menandai yang gagal. (Kode lain dalam array — TransactionConflict, ItemCollectionSizeLimitExceeded, ProvisionedThroughputExceeded, ThrottlingError, ValidationError — berarti hal yang berbeda.)

Cara memperbaikinya

  1. Periksa CancellationReasons dalam exception dan temukan indeks dengan ConditionalCheckFailed — itulah aksi yang gagal.
  2. Baca ulang item dan putuskan: coba lagi dengan prasyarat baru (loop retry optimistic-lock) atau munculkan konflik ke pemanggil.
  3. Perbaiki kondisi jika salah — mis. attribute_not_exists(pk) pada item yang secara sah sudah ada.
  4. Tambahkan ReturnValuesOnConditionCheckFailure: ALL_OLD ke aksi yang gagal agar DynamoDB mengembalikan item yang melanggar kondisi (bagus untuk debugging).
  5. Batasi retry Anda — kondisi yang gagal terus-menerus adalah konflik bisnis nyata, bukan kesalahan transien; jangan coba lagi selamanya.

Men-debug transaksi gagal secara manual? Periksa keadaan item saat ini di aplikasi desktop DynoTable untuk melihat persis mengapa prasyarat tidak terpenuhi sebelum Anda coba lagi.

FAQ

Bagaimana saya tahu item mana dalam transaksi saya yang gagal? Baca array CancellationReasons pada TransactionCanceledException. Ia bersifat posisional — satu entri per item yang diminta, berurutan. Entri dengan kode ConditionalCheckFailed mengidentifikasi aksi yang condition expression-nya bernilai false; entri dengan kode None berhasil.

Apakah ConditionalCheckFailed di dalam transaksi dapat dicoba ulang? Tidak secara otomatis. Ini konflik prasyarat nyata, bukan kesalahan transien. Baca ulang item, putuskan apakah tulisan masih berlaku, dan coba lagi dengan kondisi baru — atau munculkan konflik ke pengguna.

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.