Makale Özeti

Sanırım transaction konusunu en iyi tanımlayabileceğim örnek banka uygulamaları olacaktır. Hesabınızdan, başka bir hesaba para transferi yaptığımızı düşünelim. Bunu internet üzerinden, şubeden veya telefon bankacılığı yöntemlerinden herhangi birini kullanarak yapabiliriz. İşlem adımları şu şekilde olacaktır.

Makale

Sanırım transaction konusunu en iyi tanımlayabileceğim örnek banka uygulamaları olacaktır. Hesabınızdan, başka bir hesaba para transferi yaptığımızı düşünelim. Bunu internet üzerinden, şubeden veya telefon bankacılığı yöntemlerinden herhangi birini kullanarak yapabiliriz. İşlem adımları şu şekilde olacaktır.

- Hesabınızda transfer etmek istediğiniz kadar para mevcut olup olmadığının kontrolü.
- Hesabınız müsait ise paranın sizin bakiyenizden düşülmesi.
- Karşı tarafın bakiyesine transfer ettiğiniz paranın eklenmesi
- İşlemin sonlanması.

Bu adımlardan herhangi birinde bir sorun ortaya çıktığını varsayalım. Örneğin siz işleminizi yaptınız, arka planda çalışan program bakiye kontrolünüzü yaptı, hesabınızdan transfer etmek istediğiniz tutarı düştü ve işte tam bu sırada herhangi bir problem yaşandı. Banka sistemleri kilitlendi, elektrikler kesildi, vs. Bu durumda sizin hesabınızdan transfer etmek istediğiniz tutar düşüldü lakin henüz karşı tarafın hesabına geçemedi. Ortada kaynağı belli olmayan, sahipsiz bir para var.

İşte bu tip durumlarda işlemlerin tamamlanıp tamamlanmama durumunu kontrol eden, tamamlanmamış işlemlerde herşeyi en başa yada işlemin belli adımına kadar geri alan bir yapıya ihtiyacımız vardır. Ve biz bu yapıyı transaction kullanarak oluşturacağız. Transaction bir işlem tamamlanan kadar ilgili işlem yapılarını kilitleyen bir yapıdan meydana gelir, herhangi bir hata ile karşılaştığı durumda işlemleri geri alır.

Transaction içersine girebilecek işlemler INSERT, UPDATE ve DELETE işlemleridir. Select işlemi sonucunda datalarda bir değişiklik oluşmadığı, sadece bir resultset döndürdüğü için transaction kapsamına almayacağız.

TRANSACTION İŞLEM ADIMLARI
- Transaction başlatılır. İşlemin başlamasının ardından ilgili kayıtlar diğer kullanıcıların kullanımına kapatılmıştır.
Zira şöyle bir durum düşünelim: Siz hesabınızda bulunan bir miktar parayı aynı anda hem internet bankacılığı hemde telefon bankacılığı yardımıyla farklı hesap numaralarına transfer etmek istediniz. Bu elbette legal olmayan bir düşünce sonucu ortaya çıkmış ve gerçek zamanla düşündüğünüzde pekde olası olmayan bir komplo teorisidir. Bu durumda şayet işlemin biri başladığında blok konulmaz ise diğer araç yardımıylada zaten üzerinde işlem yapılmakta olan kayıt değiştirilebilir.

- Transaction bloğunda yapılan her işlemin ardından başarı durumuna bakılır. Şayet işlem başarılı ise devam edilir, değilse geri alım (rollback) işlemi yapılır.

- Tüm işlemler tamamlandığı anda COMMIT ile bilgiler yeni haliyle sabitlenir ve data üzerindeki kilit kaldırılır.

Şimdi yukarıda verdiğimiz örnek yapısına uygun bir uygulama yapalım. Sizin hesabınızdan alıcı hesaba 250 YTL tarnsferi için başlatılacak ve uygulanacak transaction işlemini yazalım:

DECLARE @HavaleEdilecekTutar float,
DECLARE @BizimHesabimiz NVarChar(15),
DECLARE @AliciHesap NVarChar(15)

SET @BizimHesabimiz = 12231111111
SET @AliciHesap = 12232222222
SET @HavaleEdilecekTutar = 250

Select * from TBL_HESAP

BEGIN TRANSACTION
Update TBL_HESAP
SET fld_bakiye = fld_bakiye - @HavaleEdilecekTutar
WHERE fld_hesap = @BizimHesabimiz

Update TBL_HESAP
SET fld_bakiye = fld_bakiye + @HavaleEdilecekTutar
WHERE fld_hesap = @AliciHesap



SABİTLEME NOKTASI
Bazen transaction belli noktalarda sabitlenmek istenebilir. Bu durumda transactionı kaydetmemiz gerekir. İşlemin ilerleyen safhalarında ROLLBACK yapılarak hem işlemin en başına hemde bu kaydettiğimiz sabitleme noktalarına geri dönüş sağlanabilir.
Yapı olarak

SAVE TRANSACTION <kaydetme_noktasi_adi>

Yukarıdaki örneğimizde belli noktalarda sabitleme yapalım. Bunu yaparken örenğimize bağlı kalacağız.

DECLARE @HavaleEdilecekTutar float,
DECLARE @BizimHesabimiz NVarChar(15),
DECLARE @AliciHesap NVarChar(15)

SET @BizimHesabimiz = 12231111111
SET @AliciHesap = 12232222222
SET @HavaleEdilecekTutar = 250

Select * from TBL_HESAP

BEGIN TRANSACTION
Update TBL_HESAP
SET fld_bakiye = fld_bakiye - @HavaleEdilecekTutar
WHERE fld_hesap = @BizimHesabimiz

SAVE TRANSACTION st_hesaptan_dusuldu

Select * from TBL_HESAP

Update TBL_HESAP
SET fld_bakiye = fld_bakiye + @HavaleEdilecekTutar
WHERE fld_hesap = @AliciHesap


İlk olarak hesap tablomuzu kontrol ettik. Daha sonra gönderen hesabından ilgili tutarı düştük ve transactionı kaydettik. Sonra karşı hesaba tutarın havalesini gerçekleştirdik. Burada bir hata oluşması durumunda hem işlemi tamamen geri alabiliriz hemde hesaptan tutarın düşüldüğü yere kadar olan kısmı geri alıp işlemi tekrarlayabiliriz.

Peki neden buraya geri dönmemiz gereksin?

Olmayacak bir iş ama gönderilen hesabın silindiğini var sayalım. Bu durumda para sizin hesabınızdan çıkacak ama gidecek bir hesap numarası bulunamayacaktır. Normal şartlarda bu tip durumlarda işlem tamamen geri alınır lakin biz hesabın geçici olarak kapandığını ve hemen geri açılacağı olasılığından hareket ederek işlemi bu aşamada kaydedebilir ve bu noktaya geri dönebiliriz.

Transaction işlemlerini genel olarak verdiğimiz tarz bir hesaptan diğerine nesne veya varlık geçişlerinde kullanıyoruz. Yani yapılan işlemde hata oluşması durumunda birden çok veride zarara uğrama, kaynağın belirsizleşmesi gibi olasılıklarda transaction lar ile çalışmak hayat kurtarıcı olacaktır.

Evren AYAN
www.evrenayan.net