msHOWTO

30 Nisan 2012 Pazartesi

T-Sql Transaction

Merhaba arkadaşlar.Bu makalemde sizlere oldukça önemli ve kullanılan bir yöntemi anlatacağım.Transaction.Nedir bu transaction? Bir bütün olarak çalışması gereken bir takım sql komutlarınız olduğunu düşünün.Dolayısıyla bu komutlardan birisinin çalışması sırasında oluşacak bir hata sonucunda diğer sql komutlarının sonuçları da etkilenecektir.Bu konuya en güzel örnek banka havale işlemidir aslında.Düşünün ki siz bana 1000Tl havale yaptınız.Fakat banka sizden parayı çektikten sonra bir hata oluştu ve bana çektiği parayı yatırmadı.Eee ne olacak?Para nerede ? Para uçtu değil mi ? Sizden 1000tl gitti.Bana para gelmedi.Düşünün bu şekilde 100 kere hata oluştuğunu hatta çok daha fazla miktar havale sırasında hata oluştu.Banka batar :) İşte bu şekilde son derece önemli ve bir bütün halinde başarılı çalıştıktan sonra sonuçların yansıması gereken işlemlerde Transaction kullanılır.

Şimdi id,adi ve bakiyesi kolonlarından oluşan basit bir hesap tablomuz olsun.Bu tablo üzerinden havale işlemini yapan sql komutlarını yazalım .

update Hesap set Bakiyesi-=1000 where id =2

update Hesap set Bakiyesi+=1000 where id =3

Yukarıdaki sql komutları birlikte çalışması yani bütün halinde çalışması gerekmektedir.Diyelim ki bir hata oluştu.Çok basit bir hata fırlatalım hemen .

update Hesap set Bakiyesi-=1000 where id =2
update Hesap set Bakiyesi+=(select 10/0where id =3

Yukarıdaki division by zero hatası fırlattım basit olarak.Diyelim ki bir hata oluştu id si 2 olan hesaptaki müşteriden 1000 tl düşüyor.Fakat 3 'e aktarılmıyor.Bunu engellemek için akla gelen try catch dir.

begin try
update Hesap set Bakiyesi-= 1000 where id =2
update Hesap set Bakiyesi+=(select 10/0)  where id =3
end try
begin catch
print 'hata oluştu'
end catch

Fakat bu şekilde kullanırsak da ilk işlemi yapacak diğerinde hata oluşacağı için yapmayacaktır.Try catch de işimize yaramadı arkadaşlar. Tek bir çaremiz var transaction kullanmak.

begin try
      begin transaction
            update Hesap set Bakiyesi-=1 where id =2
            update Hesap set Bakiyesi+= (select 10/0)  where id =3
      commit tran--transaction da yazılabilir.Commiti gordugunde o ana kadarki işlemleri onaylar ve gerçek verilere yansıtır.    
end try
begin catch
      print ' hata oluştu '
      rollback tran --transaction da yazılabilir.
end   catch



Evet arkadaşlar yukarıdaki bir transaction yapısı oluşturursak eğer işlemlerimizin tamamı başarılı bir şekilde gerçekleşirse sonuçları kayıtlarımıza yansıyacaktır.Aksi taktirde hiç bir işlem olmayacaktır.Buradan anlaşılan şudur: Transanction da ya hep ya hiç mantığı vardır.

Umarım faydalı olmuştur arkadaşlar.Bir sonraki makalemde görüşmek dileğiyle...

Hiç yorum yok:

Yorum Gönder