Transaction request cannot include multiple operations on one item
TL;DR — Aynı TransactWriteItems isteğindeki iki eylem aynı öğeyi (aynı birincil anahtar) hedefliyor. DynamoDB, bir işlemdeki her öğenin benzersiz olmasını gerektirir, bu yüzden herhangi birini çalıştırmadan önce tüm çağrıyı reddeder. Yinelenen eylemleri bir tanesine birleştirin ya da birini ayrı bir yazmaya taşıyın.
Ne anlama gelir
ValidationException: Transaction request cannot include multiple operations on one itemBir TransactWriteItems isteği, hepsi işlenen ya da hepsi başarısız olan en fazla 100 eylemi (Put, Update, Delete, ConditionCheck) gruplar. O API'nin kesin bir kuralı, hiçbir iki eylemin aynı öğeyi hedefleyememesidir — DynamoDB bir öğeyi tam birincil anahtarıyla tanımlar ve her anahtar en fazla bir kez görünebilir. Bu, işlem yürütülmeden önce yakalanan bir HTTP 400 ValidationException'dır ve olduğu gibi yeniden denenebilir değildir.
Neden olur
- Aynı anahtarda bir
ConditionCheckartı bir yazma — bir öğede bir koşulu ileri sürmeye ve aynı işlemde onuUpdate/Deleteetmeye çalıştınız. Bunun yerine koşulu yazmanınConditionExpression'ına katın. - Aynı anahtara iki yazma — örneğin aynı öğe için bir
Putve birUpdate, genellikle anahtara göre yineleme gidermeyen bir döngüden. - Yinelenen anahtarlı üretilmiş bir toplu istek — bir ORM ya da eşleme katmanı aynı bölüm+sıralama anahtarını iki kez yaydı.
- Farklı olduğunu düşündüğünüz tablolar genelinde iki farklı eylemde aynı anahtar — öğe benzersiz olarak
{tablo, PK, SK}'dir; aynı tablo içinde bir tekrar onu tetikler.
Nasıl düzeltilir
- İşlemi oluşturmadan önce birincil anahtara göre yineleme giderin — her
{PK, SK}bir kez görünebilir. - Koruduğu yazmaya bir
ConditionCheck'i birleştirin: ayrı birConditionCheckeylemi eklemek yerine ileri sürmeyi o öğenin kendiConditionExpression'ına koyun. - İki eylem yerine tek bir
UpdateExpression(SET/ADD/REMOVE) kullanarak iki değişikliği birUpdate'te birleştirin. - İşlemler gerçekten tek bir eylem olarak ifade edilemiyorsa, kaçınılmaz çok adımlı mantığı ayrı işlemlere ya da yazmalara bölün.
Çok öğeli işlemleri elle oluşturmak, yinelenen anahtarların sızdığı yerdir. DynoTable masaüstü uygulaması, her öğeyi birincil anahtarıyla gösterir, böylece isteği göndermeden önce tekrarlanan bir hedef bellidir.
Önce DynoTable’da kontrol et
Çok öğeli bir işlem oluşturmadan önce hedef anahtarları DynoTable'da listeleyin; ⌘K ile tabloyu açın ve eylem listenizde her bir birincil anahtarın benzersiz olduğunu onaylayın. Aşamalandırma (⌘S), ölçeği büyütmeden önce tek öğelik bir işlemi test etmenize olanak tanır.
Birleştirme koşulu, Expression Builder kullanarak yazma işlemlerini kontrol eder. Profilleri ⌘P ile değiştirin; bkz. Connect to AWS ve Install.
Kaynaklar
- TransactWriteItems — Amazon DynamoDB API Reference (2026-07-13 tarihinde doğrulandı)
- Amazon DynamoDB Transactions: How it works (2026-07-13 tarihinde doğrulandı)
İlgili hatalar
- TransactionCanceledException — işlem ayrıştırıldı ama bir koşul ya da çakışma onu işleme sırasında iptal etti.
- Too many items in a TransactWriteItems call — bir işlemde 100'den fazla eylem.
- ValidationException (genel bakış)
- Kod örneği: TransactWriteItems in Node.js — uyarlanacak geçerli bir çok öğeli işlem.
- Öğrenin: DynamoDB transactions
Kaynaklar
- TransactWriteItems — Amazon DynamoDB API Reference
- Amazon DynamoDB Transactions: How it works — Amazon DynamoDB Developer Guide
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.