SQL VE TSQL DERS 22: TRANSACTION YAPISI

Belirli bir grup işlemin arka arkaya gerçekleştirilmesine rağmen, işlemlerin

seri yada toplu halde değerlendirilip hepsinin düzgün bir şekilde ele alınması

gerektiğinde kullanılır. Prensip olarak ya hepsini gerçekleştirir yada hiçbirisini

gerçekleştirmez. Böylece yarım yamalak çalışarak data kaybı yaşanmasına engel

olur. Verilebilecek en güzel örneklerden biri banka havalesi diyebiliriz. Gönderenden

bakiye düşücek ve alıcıya o bakiye aktarılcak. Şimdi bu örneği aşağıdaki inceleyelim.

create table hesap
(
id int IDENTITY (1,1) PRIMARY KEY,
tckimlikno nvarchar(11) UNIQUE,
ad varchar(20),
bakiye money
)


insert into hesap values ( '12345678901','emre','600')
insert into hesap values ( '98765432101','fuat','400')
begin try

update hesap set bakiye-=100 where ad ='emre'
raiserror ('Elektrikler Kesildi',16,2)
update hesap set bakiye+=100 where ad='fuat'

end try

begin catch
print 'Beklenmedik Hata'
end catch

/* 
Try catch içinde kod bloğumuzu çalıştırdık.
Önce Emreden 100 lira alır bakiyeden düşer
Sonra hata ile karşılaşınca direk catch 
bloğu içine girer ve beklenmedik hata diye
çıktı verir. Bu durumda Emreden 100 lira alınır
ama Fuata aktarılmadan işlem sona erer.
*/

İşte bu durumda yardımımıza transaction yetişir.

begin try
begin tran
update hesap set bakiye-=100 where ad ='emre'
raiserror ('Elektrikler Kesildi',16,2)
update hesap set bakiye+=100 where ad='fuat'
commit tran 
end try

begin catch
print 'Beklenmedik Hata'
rollback tran
end catch

/*
Az önceki gibi Emreden 100 lira düşer. Sonra hata ile karşılaşır
ve catch bloğu içerisine girer beklenmedik hata mesajını verir
Ondan sonra rollback tranla karşılaşır ve yapılan işlemler geri
alınır böylece işlem gerçekleşmeyince Emreden alınan 100 lira 
geri iade edilir.
 */

En kısa yoluyla try catch ve raiserror kullanımı aşağıdaki gibidir.

BEGIN TRY
PRINT 3/0
END TRY -- İşlem bloğu try' ın içerisinde


BEGIN CATCH
RAISERROR('Hiç bir sayı sıfıra bölünemez, hata oluştu',16,1);
END CATCH
-- Yakalama işlemi catch bloğunda ve raiserror ile ekrana hata yazılıyor.