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 yuvadakiNone, o öğenin sorunsuz olduğu anlamına gelir,ConditionalCheckFailedbaşarısız olanı işaretler. (Dizideki diğer kodlar —TransactionConflict,ItemCollectionSizeLimitExceeded,ProvisionedThroughputExceeded,ThrottlingError,ValidationError— farklı bir şey ifade eder.)
Nasıl düzeltilir
- İstisnadaki
CancellationReasons'ı inceleyin veConditionalCheckFailediçeren indeksi bulun — başarısız olan eylem odur. - Öğ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.
- Yanlışsa koşulu düzeltin — örneğin meşru biçimde zaten var olan bir öğede
attribute_not_exists(pk). - Başarısız eyleme
ReturnValuesOnConditionCheckFailure: ALL_OLDekleyin, böylece DynamoDB koşulu bozan öğeyi döndürür (hata ayıklama için harika). - 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
- ConditionalCheckFailedException — tek bir işlemsel olmayan yazmadaki aynı hata.
- TransactionCanceledException (genel bakış) — tüm iptal neden kodları.
- TransactionConflictException — aynı öğede eşzamanlı bir işlem.
- Kod örneği: TransactWriteItems in Node.js · Python (boto3) ile — uyarlanacak çalışan koşullu bir işlem.
- Öğrenin: DynamoDB transactions · Condition expressions
References
- TransactWriteItems — Amazon DynamoDB API Reference
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
- DynamoDB condition expression examples — Amazon DynamoDB Developer Guide
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.