TRANSACTIONS
Transaction’lar, aynı anda birden çok işlemin yapıldığı
durumlarda, bütünü oluşturan parçalardan en az birinde hata meydana gelirse
bütün işlemleri geriye almamızı sağlayan ifadelerdir.
Transaction ifadelerini en yaygın olarak 2 yolla oluşturmak
mümkündür: Bunlardan ilki, Auto Commit Transaction; ikincisi ise Explicit
Transaction’dır.
Auto Commit Transaction
· Hiçbir transaction modu tayin edilmediyse SQL
Server bu modda çalışır.
·
Auto commit modunda her bir batch bir
transaction bloğu olarak ele alınır.
·
Batch içerisinde bir sorun olursa da, SQL Server
otomatik olarak bütün batch’i geri alır yani rollback eder.
·
INSERT,UPDATE,DELETE gibi diğer komutlardan ayrı
olarak gönderilen ifadeler SQL Server tarafından otomatik olarak transaction
içerisinde paketlenir. Bu tek ifadeli transaction’lar, ifade başarılı olduğunda
otomatik olarak commit edilir(onaylanır) ya da runtime hatası neticesinde otomatik
olarak rollback edilir(geri alınır).
Explicit Transaction
·
Kullanıcının TCL komutları (begin,
commit,rollback) kullanarak başlattığı transaction’lardır.TCL, T-SQL'in alt kümesidir.
·
Batch’lerde runtime hatası olduğunda, örneğin; 2
tabloya aynı anda veri girişi yapmak istediğimizi düşünelim. Bir tanesine giriş
oldu fakat sonrasında runtime hatası verdi ve ikincisine giriş olmadı.
insert into ... values …
insert into … values …
GO
Bu
durumda yazdığımız iki insert ifadelerini kullanıcı tanımlı transaction’ın
içine sokarak bu olumsuzluktan kurtulabiliriz. (İlgili örneğe en aşağıda ulaşabilirsiniz).
BEGIN TRANSACTION
·
Transaction işlemini başlatır. İşlem başarılıysa
bitirmek için COMMIT TRANSACTION / COMMIT TRAN, başarısızlık durumunda bitirmek
için de ROLLBACK TRANSACTION / ROLLBACK TRAN kullanılır.
·
İç içe transaction’larda eğer dış kısımdaki
transaction rollback olduysa (geri alındıysa) içteki transaction da işlem
görmüşse bile rollback edilir.
·
Transaction’lar COMMIT TRANSACTION ya da
ROLLBACK TRANSACTION görünceye kadar devam eder ya da başlangıçtaki bağlantı
kesilene kadar yani SQL Server otomatik olarak transaction’ı rollback edene
kadar sürer.
COMMIT TRANSACTION
Başarılı olan transaciton’ı veritabanına kaydeder.
ROLLBACK TRANSACTION
·
Başarısız bir transaction’ın sonunda ROLLBACK
komutunu kullanırız.
·
Transaction sırasında meydana gelen değişiklikleri
geri almada kullanılır. Örneğin, insert, delete, update yapılan satırlar ya da
create edilmiş objeler gibi.
·
CATCH bloğu içerisinde kullanılabilir.
·
Geri almadan önce (rollback), XACT_STATE
fonksiyonunu kullanarak transaction’ın durumunu öğrenebiliriz. Bu CATCH bloğu
içerisindeki hatalardan kaçınmamızı sağlar.
XACT_STATE Sonucu Tanımı
0
Aktif kullanıcı transaction’ı yok.
1
Aktif, yürütülmekte olan
transaction mevcut
-1 Aktif kullanıcı transaction mevcut ama
hatalı. Transaction sadece geri alınabilir.
XACT_ABORT
Hata meydana geldiğinde SQL otomatik olarak geri alma işlemi
yapmaz. Geri almak için ROLLBACK ifadesi kullanılır ya da XACT_ABORT devreye
sokulur. XACT_ABORT ifadesi SQL Server runtime hatası verdiğinde yürütülmekte
olan transaction’ın otomatik olarak geri alınmasını sağlar.
Default olarak XACT_ABORT kapalıdır. Bunu ayarlamak için SET
komutu kullanılır.
Batch’lerden Oluşan Transaction
Transaction Örneği:
BEGIN TRY
BEGIN TRANSACTION
INSERT INTO Siparisler
(musteriID, personelID, siparisTarihi) VALUES (1,1,’2015-08-14’);
INSERT INTO
SiparisDetay (siparisID, urunID, birimfiyat, adet) VALUES (2,4,50,150);
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER(),
ERROR_MESSAGE();
ROLLBACK TRANSACTION;
END CATCH;
Burada TRY bloğu içinde, INSERT ifadesi BEGIN TRAN ve COMMIT
TRAN ifadeleri tarafından sarılmıştır. Bu INSERT ifadesinin tamamıyla başarıyla
gerçekleşmesini ya da tamamıyla başarısız olmasını sağlar. Eğer herhangi bir
runtime hatası vermezse, transaction gerçekleşir ve iki insert ifadesinin
sonucu veritabanına işlenir. Eğer birinci INSERT işlemi sırasında hata olursa
execution CATCH bloğa geçer; ikinci INSERT işlemini atlayarak CATCH bloğu
içindeki ROLLBACK ifadesi transaction’ı sonlandırır. Eğer ikinci INSERT işlemi
sırasında hata olursa execution CATCH bloğa geçer. İlk INSERT komutu başarıyla
tamamlandığından ve satırlar Siparisler tablosuna eklendiği için ROLLBACK
ifadesi başarılı olan INSERT işlemini geri alır.