Too many actions in a TransactWriteItems call

TL;DR — Bir DynamoDB işlemi 100 eylemle sınırlıdır. TransactWriteItems (ve TransactGetItems), 100'den fazla Put/Update/Delete/ConditionCheck eylemi olan bir isteği reddeder. İşi birden çok işleme bölün — ya da ya hep ya hiç atomikliğine ihtiyacınız yoksa, bunun yerine BatchWriteItem (çağrı başına 25) kullanın.

Ne anlama gelir

ValidationException: 1 validation error detected: Value '<your request>' at 'transactItems' failed to satisfy constraint: Member must have length less than or equal to 100

Hizmet, <your request> yerine serileştirilmiş isteğinizin tamamını geri yansıtır — 101 eylemli bir işlem için bu yaklaşık 65.000 karakterdir. Asıl bulgu son cümledir.

TransactWriteItems, hepsi birlikte işlenen ya da hepsi birlikte geri alınan eylemleri gruplar, ancak tek bir işlem en fazla 100 eylem tutabilir ve işlemdeki öğelerin toplam boyutu 4 MB'yi aşamaz. Daha fazlasını iletin ve DynamoDB yürütmeden önce tüm çağrıyı reddeder. Mesaj genellikle TransactItems liste uzunluğunda bir kısıtlama olarak okunur. Bu, işlem daha küçük olana kadar istemci tarafında, yeniden denenebilir olmayan bir HTTP 400 ValidationException'dır.

Neden olur

  • Çok fazla yazmayı atomik olarak toplu işlemek — bir işlemde 150 put'u işlemeye çalışmak.
  • Tek bir TransactItems listesine sınırsız eylem ekleyen bir döngü.
  • 100'ü aşan fan-out — 100'den fazla öğeye dokunan ve tek bir işlem olarak modellenen bir mantıksal işlem.
  • Yalnızca yazmaları saymakConditionCheck eylemlerinin de 100'e doğru saydığını unutmayın.

Nasıl düzeltilir

  1. Her biri ≤100 eylem olan birden çok işleme bölün — her işlemin bağımsız olarak atomik olduğunu unutmayın (birlikte geri alınmazlar).
  2. Hiç bir işleme ihtiyacınız olup olmadığını yeniden değerlendirin — yazmalar ya hep ya hiç semantiği gerektirmiyorsa, BatchWriteItem (çağrı başına ≤25) daha ucuzdur ve verim açısından daha dostudur.
  3. Eylem sayısını azaltın — bir öğeye yapılan birden çok değişikliği birleşik bir UpdateExpression içeren tek bir Update'e katın.
  4. Toplamı, tek bir mantıksal değişiklik daha az öğeye dokunacak şekilde farklı modelleyin.

Nasıl yeniden oluşturulur

Sınırın bir üstü olan 101 eylemli bir işlem. Ret, işleme özgü bir hata değil, dizi uzunluğuna dair düz bir ValidationException'dır:

const actions = Array.from({length: 101}, (_, i) => ({
  Put: {TableName: 'orders', Item: {pk: {S: `T#${i}`}, sk: {S: 'META'}}}
}));
await client.send(new TransactWriteItemsCommand({TransactItems: actions}));

Gerçek çıktı:

ValidationException: Member must have length less than or equal to 100
HTTP 400

İfadeye dikkat edin: DynamoDB bunu TransactItems dizisi üzerindeki bir uzunluk sınırı olarak reddeder; yani aldığınız dize işlemlerden hiç söz etmez. Yalnızca mesajı aratmak sizi bariz biçimde buraya getirmez.

DynoTable workbench

Atomik olarak 100'den fazla yazma işlemi gerçekleştirmeden önce, DynoTable'deki hedef öğeleri inceleyin; ⌘K ile tabloyu açın ve her anahtarın mevcut olduğunu onaylayın. Aşamalandırma (⌘S) önce daha küçük bir işlemi test etmenize olanak tanır.

Expression Builder'de çok öğeli güncellemeler oluşturun ve bir tuştaki yinelenen eylemleri tek bir Update'ye katlayın. Profilleri ⌘P ile değiştirin; bkz. Connect to AWS ve Install.

Kaynaklar

İlgili hatalar

Kaynaklar

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

2026-07-26 tarihinde AWS SDK for JavaScript v3.1095.0 ile DynamoDB Local 2.x'e karşı yeniden üretildi — yukarıdaki çıktı birebir alınmıştır.

Console olmadan DynamoDB ile çalış

DynamoDB’nin çalıştıramadığı gerçek SQL’i çalıştıran hızlı bir DynamoDB masaüstü istemcisi — JOINs, GROUP BY, toplamalar — görsel düzenleme ve kendi Bedrock anahtarların üzerinde bir yapay zekâ aracısıyla.

30 günlük ücretsiz deneme, kredi kartı yok — ardından süre sınırı olmayan Ücretsiz plan.