TransactionInProgressException

TL;DR — Bir TransactWriteItems yeniden denemesi, hâlâ yürütülen bir denemeyle aynı ClientRequestToken'ı taşıdı. Bu genellikle istemcinizin işlem tamamlanmadan daha hızlı zaman aşımına uğramasıdır, dolayısıyla SDK'nın yeniden denemesi süren orijinalle çakışır. Geri çekilmeyle yeniden denemeye devam edin — orijinal bittikten sonraki bir yeniden deneme idempotent başarıyı döndürür — ve en az bir yeniden deneme ~5 saniye sonra insin diye zaman aşımlarını ayarlayın.

Ne anlama gelir

TransactionInProgressException: The transaction with the given request token
is already in progress.

ClientRequestToken, TransactWriteItems'ı idempotent yapar: 10 dakikalık bir pencere içindeki özdeş çağrılar tek bir işlem olarak sayılır. İlk deneme hâlâ işlenirken, aynı belirteçle ikinci bir çağrı henüz yanıtlanamaz — ne tamamlanmış bir işlemin yinelenmesi ne de yeni bir tanesidir — bu yüzden DynamoDB onu bu istisnayla reddeder. Bu bir veri hatası değil, bir zamanlama sinyalidir.

Neden olur

  • İşlem gecikmesinden daha kısa istemci zaman aşımı — istek zaman aşımı tetiklenir, SDK yeniden dener ve yeniden deneme, orijinal işlem hâlâ işlenirken ulaşır.
  • Agresif yeniden deneme ilkesi — çok kısa geri çekilme, birkaç saniyeye ihtiyaç duyan bir işleme birkaç yeniden denemenin yığılabileceği anlamına gelir.
  • Bir belirteci paylaşan iki çağıran — ayrı süreçler bilerek (ya da yanlışlıkla) aynı ClientRequestToken'ı eşzamanlı gönderir.

Nasıl düzeltilir

  1. Yeniden denemelerin üstel geri çekilmeyle devam etmesine izin verin — süren işlem tamamlandığında, aynı belirteçle bir yeniden deneme, yazmaları iki kez uygulamadan başarı döndürür. Bu istisnayı yeniden denenebilir olarak ele alın.

  2. Bir yeniden deneme işlem yerleştikten sonra insin diye belgelenen rehberliğe göre zaman aşımlarını ayarlayın:

    • ilk denemeden bu yana 5 saniye geçtikten sonra en az bir yeniden denemenin işlenmesine izin verin;
    • istek başına zaman aşımını yaklaşık 1 saniye ya da daha yüksek ayarlayın;
    • soket zaman aşımını istek zaman aşımının biraz altında tutun;
    • denemeler arasında üstel geri çekilme kullanın.
  3. Yeniden denemede belirteci döndürmeyin — deneme başına yeni bir ClientRequestToken üretmek, yeniden denemeleri sessizce yeni işlemlere dönüştürür (yazmaları iki kez uygular). En fazla 10 dakika boyunca aynı niyet, aynı belirteç:

    const token = randomUUID(); // one token per logical transaction
    await client.send(new TransactWriteItemsCommand({TransactItems, ClientRequestToken: token}));
  4. Kasıtlı eşzamanlı çağıranları sıralı yürütün — iki işçi aynı mantıksal işlemi gönderebiliyorsa, birini sahip yapın ya da her ikisini bir kuyruk üzerinden yönlendirin.

İşlemler zaman aşımlarını tetikleyecek kadar uzun çalışıyorsa, neyle çekiştiklerini kontrol edin — DynoTable masaüstü uygulaması, ilgili öğeleri incelemenize olanak tanır ve DynamoDB fiyatlandırma hesaplayıcısı, işlemsel yazmaların iki katına çıkan yazma kapasitesinin maliyetini gösterir.

İ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.