DynamoDB TransactionCanceledException — ConditionalCheckFailed

TL;DR — TransactWriteItems çağrınız iptal edildi ve CancellationReasons dizisi bir ConditionalCheckFailed girdisi içeriyor. İşlemin koşul ifadelerinden biri sağlanmadı, bu yüzden DynamoDB her eylemi atomik olarak geri aldı. Nedenler dizisini okuyun — girdileri konumsaldır, istenen öğe başına bir tane — hangi öğenin koşulunun başarısız olduğunu bulmak için, sonra o öğenin ön koşulunu veya veriyi düzeltin.

Ne anlama gelir

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

TransactWriteItems ya hep ya hiçtir. Herhangi bir eylemin ConditionExpression'ı false olarak değerlendirilirse, DynamoDB tüm isteği iptal eder ve öğe başına bir neden listesi bildirir. i konumundaki ConditionalCheckFailed, i. öğenin koşulunun karşılanmadığı anlamına gelir — işlem asla kısmen uygulanmadı.

Neden olur

  • İyimser kilit kaçırması — başka bir yazıcı öğeyi zaten değiştirdiği veya oluşturduğu için bir version = :v / attribute_not_exists(pk) koruması başarısız oldu.
  • Benzersizlik koruması tetiklendi — bir attribute_not_exists(pk) eklemesi bir yarışı kaybetti, dolayısıyla öğe zaten var.
  • Bayat okuma — koşul, o zamandan beri değişmiş bir değerden oluşturuldu.
  • Neden listesi yanlış okundu — dizi konumsaldır, TransactItems'ınız gibi sıralıdır; bir yuvadaki None, o öğenin sorunsuz olduğu anlamına gelir, ConditionalCheckFailed başarısız olanı işaretler. (Dizideki diğer kodlar — TransactionConflict, ItemCollectionSizeLimitExceeded, ProvisionedThroughputExceeded, ThrottlingError, ValidationError — farklı bir şey ifade eder.)

Nasıl düzeltilir

  1. İstisnadaki CancellationReasons'ı inceleyin ve ConditionalCheckFailed içeren indeksi bulun — başarısız olan eylem odur.
  2. Öğeyi yeniden okuyun ve karar verin: yeni bir ön koşulla yeniden deneyin (iyimser kilit yeniden deneme döngüsü) ya da çağırana bir çakışma bildirin.
  3. Yanlışsa koşulu düzeltin — örneğin meşru biçimde zaten var olan bir öğede attribute_not_exists(pk).
  4. Başarısız eyleme ReturnValuesOnConditionCheckFailure: ALL_OLD ekleyin, böylece DynamoDB koşulu bozan öğeyi döndürür (hata ayıklama için harika).
  5. Yeniden denemelerinizi sınırlayın — sürekli başarısız olan bir koşul, geçici bir hata değil, gerçek bir iş çakışmasıdır; sonsuza kadar yeniden denemeyin.

Başarısız bir işlemi elle mi ayıklıyorsunuz? Yeniden denemeden önce ön koşulun neden sağlanmadığını tam olarak görmek için DynoTable masaüstü uygulamasında mevcut öğe durumunu inceleyin.

SSS

İşlemimdeki hangi öğenin başarısız olduğunu nasıl bilirim? TransactionCanceledException üzerindeki CancellationReasons dizisini okuyun. Konumsaldır — istenen öğe başına bir girdi, sırayla. Kodu ConditionalCheckFailed olan girdi, koşul ifadesi false olarak değerlendirilen eylemi tanımlar; kodu None olan girdiler başarılı oldu.

Bir işlem içindeki ConditionalCheckFailed yeniden denenebilir mi? Otomatik olarak değil. Bu, geçici bir hata değil, gerçek bir ön koşul çakışmasıdır. Öğeyi yeniden okuyun, yazmanın hâlâ geçerli olup olmadığına karar verin ve yeni bir koşulla yeniden deneyin — ya da çakışmayı kullanıcıya bildirin.

İlgili hatalar

References

En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.

Console olmadan DynamoDB ile çalışın

DynoTable, DynamoDB için hızlı bir masaüstü istemcisidir — tablolara göz atın, SQL tarzı sorgular çalıştırın ve item'ları yerel olarak düzenleyin.