SQL Transactions
Çarşamba, 29 Mar 2017
yorum yok
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).
· 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.
· 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.
· 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.
· 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.