bir insert işleminden önce transaction ı baslatırız insert ü çalıstırırız ve ardından commit ederriz tüm bu operasyonları bir hata yönetimi bloğu içersinde yaparız ki rollback edebilelim.hibernate gibi araclar performans nedeniyle bu insert işlemini commit edene dek database işlemiz kendi cache lerinde tutarlar flush metodu da cache boşaltmaya zorlar yine veridabanına işlenir.şimdi bu noktada internette bazı kaynaklar roolback ile geri alınabileceklerini yazıyor.peki bu kullanım tam olarak hangi senaryo için iyi olacaktır? tüm gün boyunca yapılan insertleri hiç commit edtmeyip flush edelip ardından gün sonunda tek bi commit gönderelimbu yaklasım mantıklımıdır gün içersinde veritabanında bi sorun olursa flush ile eklenenler silinecekmidir gerci bu belki DBMS e göre değişebilir

soruldu: 20 Mar '12, 09:09

trueLife's gravatar image

trueLife
699182430
cevap kabul oranı: 10%

değiştirildi: 07 May '12, 04:05

%C3%B6zcanacar's gravatar image

özcanacar ♦♦
17.2k59183183


Bu yaklasim, yani gün boyunca commit etmeme yaklasimi bence hic mantikli degil. Böyle bir uygulama seklide hic duymadim simdiye kadar. Herseyden önce sen verileri Commit etmedigin sürece, diger kullanicilar bunlari göremezler. Sen istedigin kadar Insert, Delete, Update yap, sen Commit etmedigin sürece, bunlarin hepsi senin icin ayrilmis bir Transaction icinde olur. Bu bakimdan da, yan masada calisan arkadasin bu degisiklikleri göremez veritabninda.

Bir baska sorun da, gün boyu yaptigin islemler büyük ihtimalle birbirinden bagimsiz. Yani bir seferinde müsteri ekliyorsun, diger seferinde bir kac Satici ekliyorsun ve ya bir baska seferde bir kac Arac ekliyorsun diyelim veritabanina. Eger bunlarin hic birini commit etmesen, ve en son arac eklerken bir sorun olsa, bütün yaptigin islemler geri alinacak. Aslinda müsterileri ve saticilari kaydederken hic problem olmadigi halde, bunlarda geri alinacak. Bu bakimdan, birbiri ile iliskili, veri bütünlügü icin hepsinin bir seferde yapilmasi gereken islemler ayni Transaction icinde olmasi gerekir.

Örnegin, diyelimki ForeingKey yok tablolarin arasinda ve iliskisel tablolari kendin silmek istiyorsun; bir müsterinin iletisim bilgilerini sildin önce, sonra e-Mail lerini ve sonra da Faturalarini. Simdi sira Müsterinin kendisini silmekte. Ama tam bu sirada bir hata olustu ve sen müsteriyi silemedin. Eger bütün bu islemler ayri Transactionda olursa, ve ayri ayri commit edilirse, müsteri silinmedigi halte onun bütün bilgileri silindi. Veri kaybi oldu yani. Iste tam bu nedenle bunlarin hepsi ayni Transaction da olmali ve sen Commit ettiginde ya hepsi basarili bir sekilde yapilmali, yada hepsi geri alinmali. Transaction larin özelliklerini bu link ten okuyabilirsin.

Biraz uzun oldu belki ama umarim yardimci olur.

permanent link

cevaplandı: 21 Mar '12, 05:07

mceliksoy's gravatar image

mceliksoy ♦
6.5k84988
cevap kabul oranı: 25%

oldukça acıklayıcı uzun cevap için özellikle teşekkür ederim :)

(21 Mar '12, 17:18) trueLife trueLife's gravatar image

rica ederim, kolay gelsin

(22 Mar '12, 05:28) mceliksoy ♦ mceliksoy's gravatar image

eger cevabin dogru oldugunu düsünüyorsan, "Dogru Cevap" olarak kabul edetmen, bu konuda arayis icinde olan arkadaslara da yardimci olmus olur.

(07 May '12, 04:00) mceliksoy ♦ mceliksoy's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×86
×7

Soruldu: 20 Mar '12, 09:09

Görüntüleme: 1,245 kez

Son güncelleme: 07 May '12, 04:05

powered by BitNami OSQA