← nitronium.dev
SQLAlchemy: loop içinde exception sonrası PendingRollbackError
2026-06-20
Birden fazla işlemi sırayla yapan bir döngüde SQLAlchemy session kullanırken, bir iterasyonda exception fırlarsa session bozuk durumda kalır. Sonraki iterasyon aynı session'ı kullanmaya çalışınca şu hata gelir:
`
sqlalchemy.exc.PendingRollbackError: Can't reconnect until invalid transaction is rolled back
`
Arka planda ne oluyor: SQLAlchemy session bir transaction yöneticisi gibi davranır. Exception gelince transaction "failed" state'e girer. Bu state'den çıkmak için ya rollback() ya da close() gerekir.
Fix — except bloğuna db.rollback() ekle:
`python
for sinif in siniflar:
try:
count = asyncio.run(run_scanner(sinif=sinif, db=db))
results[sinif] = count
except Exception as e:
logger.error(f"Sinif {sinif} tarama hatasi: {e}")
db.rollback() # bu olmadan sonraki iterasyon da patlıyor
results[sinif] = 0
`
db.rollback() olmadan hata izolasyonu yapmış gibi görünürsün ama aslında ilk hatadan sonra tüm iterasyonlar PendingRollbackError fırlatır. Sessizce başarısız olduğu için de tespit etmek güçtür — logda sadece "0 kayıt işlendi" görünür.
Bunu cron job'larda, batch pipeline'larda veya birden fazla DB işlemi yapan her döngüde uygulamak gerekir.