2016-04-03 22 views
0

Web uygulamam için SQLAlchemy kullanıyorum. Böyle bir sürü kod gördüm: her commit() çalışması için gerekli olup olmadığını merak ediyorumsqlalchemy: Her işlem için geri alma gerekiyor mu?

try: 
    session.commit() 
except: 
    session.rollback() 

. Öyleyse, neden commit() işleminin bir parçası değil? Ne zaman rollback() ve ne zaman karar verilir?

+0

Eğer bu tip bir kazan plakasını çok yazıyorsanız, onu bir işleve ayırın. PS dışında "yapamazsın" yerine "İstisnalar hariç" demelisin: çünkü çıplaklar hariç, genellikle yakalamak istemeyeceğin şeyleri yakalayabilirler. – kindall

cevap

1

İşlem başarısız olduğunda, yalnızca işlemin bazı kısıtlamaları ihlal etmeden tamamlanamayacağı anlamına gelir. Prensip olarak, geri çekilmek yerine bazı güncellemeler yapabilir ve tekrar denemeyi deneyebilirsiniz. Pratikte, bu tür hata giderme mantığı akıl yürütme mantığı açısından önemsizdir, bu nedenle çoğu kişi verileri tutarlı bir halde tutmak ve sorunu kullanıcıya bildirmek için geri çeker (işlem için yapılan değişiklikleri geri alır).

+0

teşekkürler. soruyu takiben: 'commit()' çağrısının geri dönüşü test etmekte başarısız olması için nasıl yapabilirim? – lang2

+1

Bazı kısıtlamaları ihlal etmek istersiniz. Muhtemelen yapılacak en kolay şey, değiştirilmiş satırın birincil anahtarını benzersiz olmayan (INSERT için) veya olmayan (UPDATE için) olacak şekilde değiştirmektir. – szym