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
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.
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.
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}));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
- IdempotentParameterMismatchException — aynı belirteç, farklı yük.
- TransactionCanceledException — işlemin kendisi başarısız oldu.
- TransactionConflictException — başka bir işlemle öğe düzeyi çakışma.
- Kod örneği: TransactWriteItems in Node.js — ClientRequestToken kullanımını gösterir.
- Öğrenin: DynamoDB transactions
References
- 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ı.