Ş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/0) where 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