Django Transaction Atomic Yapısı

Transaction_Atomic

Django'da Transaction Atomic Yapısı

transaction_atomic.jpg

 

  • Bu yazımızda django'daki transaction atomic yapısını Django Rest Framework üzerindeki bir örnek ile anlamaya çalışacağız.
  • Django'nun varsayılan transaction davranışı otomatik işleme(autocommit) olarak çalışmaktır. Yani her bir sorgu(query) veritabanına anlık olarak işlenmektedir. Aşağıdaki örnek ile burayı anlamaya çalışalım.
  • Şimdi Product model sınıfına ait verileri python manage.py shell diyerek ekleyelim.
  • Şimdi transaction atomic yapısını anlamaya çalışalım. Aşağıdaki örneği inceleyelim
  • Yukarıdaki örnekte client tarafından gönderilen product ve product'a ait material ve rate verileri sırasıyla veritabanına ekleniyor(transaction gerçekleşiyor.)
  • Peki create(...) methodunda herhangi bir hata oluşursa bu hataya rağmen yine de veriler veri tabanına eklenmeli midir? Cevap tabi ki HAYIR. Çünkü gönderilen verinin doğrulanması ve modellerdeki yapıya uygun olması gerekmektedir. Ancak django transaction işlemlerini sıra sıra işlemiş ve herhangi hata durumunda kod kırılsa(break) veya exception fırlatsa bile transaction işlemi tamamlanan veriler veri tabanına eklenmiş olacaktır. Herhangi bir durumda hata oluşursa transaction işlemlerinin geri alınması(roll back) için transaction atomic yapısını kullanırız.
  • Örnek üzerinde görelim daha iyi anlayalım.
  • Yukarıdaki Product model sınıfına eklenen is_material_rate_sum_valid methodu product'a ait material rate(oranlarının) toplamı 100 is True, değilse False cevabı dönecektir. Client'ı materyaller toplamının 100 olmasına zorlamak istiyoruz. Kuralımız bu şekilde...
  • Aşağıdaki serializer sınıfına eklenen if state'ine dikkat edelim
  • Şimdi bu halde iken bir post request atalım
  • Cevap
  • Beklediğimiz hata mesajı alındı. ANCAK.... get request atınca bir de bakıyoruz ki...
  • Hata'ya rağmen yeni veriler eklenmiş durumda!
  • BU SORUNU transaction atomic kullanarak aşabiliriz
  • serializer sınıfını değiştirelim
  • post request atalım
  • CEVAP
  • GET request ve sonuç BAŞARILI! yeni gönderdiğimiz "name": "product 2023" verisi kaydedilmedi!

Yorumlar