17 Ocak 2017 Salı

SQL Server ve Transaction



SQL Transaction’ları da diğer işlemlerden farksız olarak atomik bir yapıya sahiptir.
Herhangi bir SQL sorgusu da aynı yapıda olduğu için ya tüm komut/sorgu başarıyla çalıştırılır ve sonucu alınır ya da veri tabanında hiçbir değişiklik yapılmadan işlem sonuçlandırılır. Dolayısı ile bunları Transaction yapıları içinde kullanmak mümkündür.
SQL Server’ da transaction’ın genel yapısı aşağıdaki gibidir.

    BEGIN TRANSACTION
    Transaction komutları
    COMMIT TRANSACTION / ROLLBACK


Aşağıdaki niteliklere sahip banka hesaplarının tutulduğu bir tablo oluşturalım.

Oluşturduğumuz bu tabloya iki adet kayıt ekleyelim. Dilerseniz daha fazla kayıtta ekleyebilirsiniz.

Oluşturduğumuz bu tablo üzerinde bir Stored Procedure (SP) tanımlayalım.

Bu SP dışarıdan havale yapanın hesap numarasını, havaleyi alacak olan kişinin hesap numarasını ve havale miktarını alacak ve Transaction başladıktan sonra havale işlemini gerçekleştirecektir.
Eğer havalede bir sorun çıkmaz ise işlem geçerli olacaktır. Bir sorun oluşur ise, her aşamada «ROLLBACK» komutu ile bütün işlemler geri alacaktır.

Oluşturduğumuz «havale» procedure’ü aşağıdaki gibidir.



SP’yi bir havale işlemi gerçekleştirerek test ederek sonuçlarına baktığımızda havale işleminin sorunsuz gerçekleştiği görülmektedir. 



 Bu transaction bloğu çalıştırıldığında hesap numaralarının herhangi birinin yanlış girilmesi durumunda dikkat edilirse herhangi bir uyarının verilmediği görülür.
Bu gibi durumlarda hata yakalama komutu olan "TRY-CATCH" yapısına ihtiyaç vardır. Bu yapı oluşacak hataları kullanıcının görmesini ve gerekli düzeltmeleri yapmasını sağlamaktadır.
TRY-CATCH bloğunu ekleyerek SP’yi yeniden düzenleyelim.

Yeni SP aşağıdaki gibi olacaktır.



Eğer herhangi bir hata meydana gelirse bir hata kodu üretilerek kullanıcı bilgilendirilecektir.
Bu hata elektrik kesintisi, donanımsal yada programlama ile ilgili bir hata olabilmektedir.