T-SQL kodlarının hatalı bir şekilde çalışması veri tutarsızlığına sebep olabilir. Bazen bu hatalar, geri dönüşü olmayan sonuçlara yol açabilir.
"Çıkabilecek bir hata ne kadar kötü bir şekilde sonuçlanabilinirki?" diye düşünebilirsiniz, hemen örnek verelim. Art arda sıralanmış para işlemlerini gerçekleştiren bir sorgunun çalışma esnasında herhangi bir sorundan dolayı hata meydana gelirse ne olacak? Hatanın olduğu kısımdan önceki sorgular çalışıp,sonrakiler çalışmayacaktır, bunun nasıl telafi edileceğini düşünmesi bile kötü, kaldı ki sorgunun tam olarak neresinde hata meydana geldiğini saptamak bile imkansız olabilir..
Artık olayın önemini kavradığımıza göre hataları nasıl kontrol edip,yönetebileceğimizden bahsedebiliriz
İlk yöntem
Öncelikle bir tablo yaratalım aşağıdaki kodu çalıştırabilirsiniz
CREATE TABLE Tablo1(ID INT PRIMARY KEY)
GO
BEGIN TRANSACTION Islem1
DECLARE @error INT
INSERT Tablo1 VALUES(1)
SELECT @error = @@ERROR
IF @error =0
BEGIN
INSERT Tablo1 VALUES(2)
SELECT @error = @@ERROR
END
IF @error =0
BEGIN
INSERT Tablo1 VALUES(3)
SELECT @error = @@ERROR
END
-- hatanın başladığı blok aşağıda
IF @error =0
BEGIN
INSERT Tablo2 VALUES(1)
SELECT @error = @@ERROR
END
IF @error =0
BEGIN
COMMIT TRAN Islem1
END
ELSE
BEGIN
ROLLBACK TRAN Islem1
END
Bu t-sql kodunu çalıştırdığınızda karşınıza çıkacak olan mesaj :
So the transaction blew up with the following error Server: Msg 208, Level 16, State 1, Line 22 Invalid object name 'Tablo2'. şeklinde olacaktır.
(Tablo2 adında bir tablo bulunmadığından dolayı böyle bir hata mesajı aldık)
Bu durumdayken
SELECT * FROM Tablo1
yazıp,tabloya hangi kayıtlar eklenmiş diye kontrol edelim, ilk 3 insert işleminin gerçekleşmiş olduğunu göreceksiniz,ama hatanın başladığı kısımdan sonrası yok..
Yine ilk haline dönelim
DELETE from Tablo1
yazıp,sorguyu çalıştıralım ve kayıtların tümü silinsin
Bu sefer sorgumuzun başına ek bir satır daha ekliyoruz ( hata çıkarsa tüm işlemleri geri alabilmesi için gerekli )
SET XACT_ABORT ON
BEGIN TRANSACTION Islem1
DECLARE @error INT
INSERT Tablo1 VALUES(1)
SELECT @error = @@ERROR
IF @error =0
BEGIN
INSERT Tablo1 VALUES(2)
SELECT @error = @@ERROR
END
IF @error =0
BEGIN
INSERT Tablo1 VALUES(3)
SELECT @error = @@ERROR
END
-- hatanın başladığı blok aşağıda
IF @error =0
BEGIN
INSERT Tablo2VALUES(1)
SELECT @error = @@ERROR
END
IF @error =0
BEGIN
COMMIT TRAN Islem1
END
ELSE
BEGIN
ROLLBACK TRAN Islem1
END
Tekrardan tablomuzdaki kayıtları listelettirme kodumuzu çalıştıralım
SELECT * FROM Tablo1
Evet, hiçbir kayıt eklenmemiş bu sefer, bunun nedeni hata oluştuğunda öncesinde yaptığı tüm işlemleri geriye almasından kaynaklanıyor.
2. Yöntemi bir sonraki makalemde açıklıyor olacağım..