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.