MSSQL Değişiklikleri Geri Almak

  • 21.23.2015
  • tayyipyetis
  • MSSQL

mssqlMerhaba, bu makalede MsSQL ile Transaction kullanımına dair temel bilgiler vereceğim. Transaction benim de yeni tanıştığım ama çok sevdiğim bir yapı çünkü başlıktan belli olacağı üzere bazı kritik işlemlerde zarar riskini en aza indirebiliyor daha da açmak gerekirse bazı işlemler bir bütün olarak işlenmek zorunda buna “bölünemezlik” ilkesi de deniliyor. yani bir amaca yönelik yazılan update, insert ya da delete komutlarının bir bütün halinde hatasız çalışması gerekir. içlerinden birinin hatalı çalışması istenmeyen sonuçlar doğurur Transaction yapısı da bu noktada devreye girer bunu .net yapısındaki Try Catch yapısına benzetebiliriz. ama sadece benzetebiliriz çünkü transaction ile belirlediğimiz komut kümesi içerisinde meydana gelen bir hatada o kümeyi hiç çalıştırmamış gibi en başa alabiliyoruz.

Bunu bir örnekle açıklamak gerekirse bir bankanın havale uygulamasını yazıyorsunuz ve amaç havale işlemi yapmak bunun için yapılacak işlemler kapataslak belli. En basit haliyle gönderen kişinin hesabından bakiye düşülüp alıcının hesabında bakiye artırılacak. yani bir dizi update işlemi ve istenilirse log tutmak için insert işlemleri yapılacak fakat bu işlemler arasında bir hata olması yanlışlıkla gönderen kişinin hesabından bakiye düşüp alıcıya aktarılmamasına ya da gönderenden bakiye düşmeyip alıcının bakiyesinin arttırılmasına sebep olabilir bunun için en kestirme çözüm ise tüm işlemleri başa almak yani hiç olmamış farzetmektir. bu kadar hikayeden sonra teknik detaya geçelim. Transaction işlemlerinde bir kaç anahtar kelimemiz var. 

  • BEGIN TRANSACTION : Bir transaction işleminin başlatıldığını ve bundan sonraki işlemlerin gerçekten değil de deneme olarak çalıştırılacağını belirtir.
  • SAVE TRANSACTION : Sabitleme noktası yerleştirmek için yani bir hata olduğunda tüm işlemleri değil de bir kısmını geri almak istediğimizde kullanılırlar.
  • ROLLBACK TRANSACTION : İşlemlerimizin bir kısmını veya sabitmele noktalarına kadar olan kısmını geri almak için kullanılır.
  • COMMIT TRANSACTION : Deneme için yazdığımız komutların kalıcı olarak çalıştırılacağını belirtir ve transaction ifadesini sonlandırır.

Örnek kullanım şablonu şu şekildedir.

BEGIN TRANSACTION
/*sql komutları*/
/*sql komutları*/
/*sql komutları*/
ROLLBACK TRANSACTION
/*veya*/
COMMIT TRANSACTION

Bu bilgiler ışığında ufak bir örnek yapalım

BEGIN TRANSACTION
DECLARE @miktar INT;
SET @miktar = 1500;
UPDATE musteriler SET bakiye=@miktar WHERE ID=51686
INSERT INTO havale(ID, musteriID, miktar, ...) VALUES(848618454, 51686, @miktar);
IF @@ERROR<>0
BEGIN 
   PRINT 'Hata oldu';
   ROLLBACK TRANSACTION;
END;
ELSE
    COMMIT TRANSACTION;

Bu örnekte bir müşterinin havale işlemi için bakiyesini güncelleyip havale tablosuna veri ekledik herhangi bir hata varsa tüm işlemleri geri al ve hatayı bildir dedik böylelikle hata varsa bile istemediğimiz karmaşıklıklar olmamasını sağladık. değişikliklerin tümünü değilde bir kısmını başa almak isteseydik şöyle yapabilirdik.

BEGIN TRANSACTION
DECLARE @miktar INT;
SET @miktar = 1500;
SAVE TRANSACTION burayakadargerial;
UPDATE musteriler SET bakiye=@miktar WHERE ID=51686
INSERT INTO havale(ID, musteriID, miktar, ...) VALUES(848618454, 51686, @miktar);
IF @@ERROR<>0
BEGIN 
   PRINT 'Hata oldu';
   ROLLBACK TRANSACTION burayakadargerial;
END;
ELSE
    COMMIT TRANSACTION;

Bu şekilde işlemlerinizi biraz daha güvenli hale getirebilirsiniz. Transaction ile yapılan işlemler eğer bir rollback ya da commit ile sonlandırılmamış ise o bağlantı sonlandığında eski haline dönerler. umarım faydalı olmuştur. yorumlarınızı bekliyorum.

Mustafa Tayyip YETİŞ
Yazılım Geliştirme Uzmanı

Yorum Yap

Diğer Makaleler

Etiketler