T-SQL Hata Kontrolü ve Yönetimi [1]

by Uğur Çelenk 3. Haziran 2008 06:29

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..

Yorum ekle




biuquote
  • Yorum
  • Canlı önizleme
Loading



Etiket Bulutu