Veri Tabanında Transaction Kavramı

Transaction, belirli işlemleri bir bütün halinde çalıştırmak için kullanılan bir yapıdır. Transaction ile birden çok komut bir blok halinde çalıştırılır ve tüm komutların başarılı olması halinde işlemler onaylanır. Eğer komutlardan bir tanesi bile başarısız olursa işlem iptal olur.

"Ya hep, ya hiç" kuralı...

Bu ifade, transaction kavramını tanımlamak için yerinde bir ifade olacaktır. Çünkü transaction içindeki tüm komutlar ya hep beraber çalışacak ya da hiçbiri çalışmayacak.

"Peki bu yapının avantajı nedir?" diye sorarsanız...

İlişkisel veri tabanı tasarımında birçok tablo birbirine bağımlı haldedir. Bir tablodaki kaydın silinmesi diğer tablodaki kayıtları da etkileyebilmektedir veya bir tabloya kayıt eklenmesi için başka bir tabloda buna ilişkin kaydın önceden eklenmiş olması gerekebilmektedir.

Transaction işlemlerinin en çok kullanıldığı sistemler banka sistemleridir çünkü banka sistemleri güvenli olmak zorundadır ve hesap işlemlerinde oluşabilecek en küçük hatalar bile telafisi imkansız büyük problemlere yol açabilir. Örneğin; "Musa Çiçek" isimli müşterinin hesabından "Özge Ataseven" isimli müşterinin hesabına para havale ederken, bir taraftan gönderenin hesabından para kesilecek diğer taraftan alıcının hesabına para eklenecektir ve bu iki işlem de beraber gerçekleşmelidir. Ya iki işlem de gerçekleşecek ya da her iki işlem de iptal edilecektir.


Örnek Senaryo

Bir banka sisteminde para havale etme işlemi için örnek bir transaction tasarlayalım.
Öncelikle aşağıdaki gibi bir "hesap" tablosu oluşturalım ve tablomuzda müşterilere ait hesap numarası, ad - soyad, şube kodu ve bakiye bilgileri tutalım.

  
Şimdi tablomuza örnek kayıtlar girelim.


Evet, şimdi senaryomuzu yazalım.

"Mehmet Duran'ın hesabından, Ayşe Kaçmaz'ın hesabına 1500 TL havale yapılsın."

Bunu yapmak için aşağıdaki adımlar izlenir

  1. Mehmet Duran'ın bakiye bilgisini 1500 azalt.
  2. Ayşe Kaçmaz'ın bakiye bilgisini 1500 artır.

Şimdi senaryomuza ait SQL kodlarını yazalım


Havale işleminin gerçekleşmesi için bu iki sorgunun aynı anda gerçekleşmesi gerekir ve sistem kullanıcısı bu iki sorguyu birden çalıştırıyor.
Evet, şimdi gelelim tehlikeli bölüme. J
Bu senaryo üzerinde gerçekleşebilecek olası hataları inceleyelim.
1 - Diyelim ki, birinci SQL sorgusunda bir hata oluştu ve ikinci sorgu çalıştı. Bu durumda, Mehmet Duran'ın hesabından herhangi bir eksilme olmayacak fakat Ayşe Kaçmaz'ın hesabına 1500 TL eklenecek ve tablomuz aşağıdaki gibi olacaktır.
Gördüğünüz gibi, Mehmet Duran'ın hesabında herhangi bir değişiklik olmadığı halde Ayşe Kaçmaz'ın hesabına 1500 TL eklenmiştir.
Bu durumda, Mehmet Duran'ın hesabında kendisine ait olmayan 1500 TL bulunmaktadır. Kısacası bedavadan 1500 TL kazanmış olacaktır. J
2 - Bir diğer hata olasılığı da birinci sorgunun çalışması fakat ikinci sorguda hata oluşması. Bu durumda Mehmet Duran'ın hesabından 1500 TL eksilme olacak fakat Ayşe Kaçmaz'ın hesabına herhangi bir ekleme olmayacak.

Gördüğünüz gibi, Mehmet Duran'ın hesabından 1500 TL düşüldü fakat bu para Ayşe Kaçmaz'ın hesabına aktarılmadı ve durumu fark eden Ayşe hanım hemen Mehmet beyi arayıp parayı yatırmadığını söyler fakat Mehmet bey parayı yatırdığını söyler ve elinde fiş bulunduğunu dahi söyler. :)

Peki, bu durumda hangisi haklıdır sizce? Tabii ki, ikisi de haklıdır fakat sorun sistemden kaynaklanmaktadır ve maalesef böyle bir durumda çok büyük para kayıpları yaşanabilmektedir.

İşte, yukarıda saydığımız problemlerin önüne geçmek için TRANSACTION yapısı kullanılır ve her iki komut birden çalıştırılır. Eğer her iki komut başarılı ise transaction onaylanır fakat herhangi bir komutta hata oluşursa her iki işlem de iptal olur. Böylece yanlış bir değişikliğin önüne geçilmiş olur.


Bu yapıyı SQL kodlarına dökmek için COMMIT - ROLLBACK komutları kullanılır.

COMMIT komutu ile çalıştırılan tüm SQL komutlarının başarılı olması halinde işlemler veri tabanına yansıtılır.

ROLLBACK komutu ise herhangi bir hata oluşumunda tüm işlemleri geri alır.


Yorumlar

Bu blogdaki popüler yayınlar

Asp.Net ile Mernisten veri Çekme