Transaction nedir ve nasıl kullanılır?

Merhaba. Bu makalemizde Mssql’in çok güzel bir özelliği olan Transactionlardan bahsedeceğiz.

Transactionlar genelde yoğun işlem yapılan ve işlemlerin tamamen bitmesinin çok önemli olduğu zamanlarda kullanılır. Eğer sorgularınız Transaction içindeyse işlemlerin hepsi başarılı olana kadar tüm işlemler başarısız sayılır. Kısaca veri kaybetmeyi göze alamayacağımız zamanlarda Transactionları kullanılır.

Bir örnekle pekiştirelim. Birçok yerde ATM örneği verilir. Bu örnek pekiştirmeye çok müsait olduğu için bende bu örneği vermek istiyorum. Düşünün ki ATM’ye gittiniz ve kartınızı taktınız ve para çekeceksiniz. Para çekme bölümüne gelerek 100TL çekmeye karar verdiniz ve ATM size parayı vermeye çalıştı ancak o anda bir atmde para sıkıştı ve size parayı veremedi.

Şimdi yazılımsal dil ile bunları şöyle örneklendirelim.

  1. ATM’ye kart sokuldu.
  2. ATM kartı okudu ve şifrenizi sordu.
  3. Şifrenizi yazdınız ve ana menüye ulaştınız.
  4. Para Çekme bölümüne geldiniz ve 100TL buttonuna tıkladınız.
    Şimdi burada sistemin büyük ihtimalle yaptığı ana işlem şöyle bir sorgudur;
    UPDATE Kullanicilar SET Bakiye = Bakiye – 100 WHERE Kullanici = ‘CihanAksoy’
    Sistem sizin hesabınızdan bakiyeyi düştü ve makineye para verme emrini gönderdi.
    Diyelimki bu fonksiyonu adı GiveMoney($MoneyAmount) olsun.
  5. GiveMoney(100) fonksiyonunu çalıştırdı. Ancak geriye hata kodu gönderdi.

Şimdi siz bütün işlemleri geçtiniz ve hesabınızdan para düştü ama atm bozuk olduğu için paranızı alamadınız. Transaction kullanmasaydık büyük ihtimalle bankaya küfür edip dava yoluna gidecektiniz.

Peki Transaction kullansaydık ne olurdu?

5. adımda hata aldığımız için sistem herşeyi geri alırdı ve kartınızı geri verirdi. Yani siz sanki hiç ATM’ye gelmemişsiniz, sanki hiç para çekmemişsiniz gibi işlemlerinizi geri sarardı. Transactionların amacı işte budur.

Sql Server 3 farklı Transaction desteği sağlamaktadır.

  1. Explicit Transactions (Harici)
    Yazılımcının BEGIN TRANSACTION bloğu ile başlattığı trans işlemleridir. Commit ifadesi ile gerçekleşmiş olarak yada ROLLBACK ifadesiyle hiç gerçekleşmemiş sayılarak sonlandırılır.
  2. Implict Transactions (Dahili)
    Sql serverın bazı kod blokları kullanıldıktan sonra otomatik olarak transaction başlatmasını sağlar. Ancak yazılımcının bunları sonlandırması beklenir. Gereksiz ve zahmetli bir işlemdir. Kullanılması pek önerilmez.
  3. Auto Commit (Otomatik)
    Herhangi bir transaction işlemi kullanılmadı ise Sql server otomatik olarak bu mod ile çalışır. Yığın sql işlemleri, Query analyzer’de 2 GO arasında kullanılan bloklar yada bir defada çalıştırılan sql kodları kapsamı alanına girer ve herhangi bir hata olduğunda otomatik olarak ROLLBACK işlemi uygular.

Burada öğrenmemiz gereken şey eğer bir Transaction bir tablonun veri kümesi üzerinde işlemdeyse ikinci bir işlem yapılamaz. Yani siz Kullaniciadi=’CihanAksoy’ olan veri kümesine trans içinde UPDATE işlemi yaparken aynı veri kümesine başka bir update işlemi yapamazsınız. Çünkü sql server transaction işlemi bitene kadar o kümeyi kilitleyecektir.

Şimdi kod bloklarımıza geçelim. Kod bloğumuzda bir bankanın internet şubesinden havale işlemini yapacağız. Öncelikle işlemleri yapacağımız tablomuzu oluşturalım.

CREATE TABLE(
 HesapNo CHAR(20) NOT NULL PRIMARY KEY,
 Adi VARCHAR(55),
 Soyadi VARCHAR(55),
 SubeID INTEGER,
 Bakiye FLOAT
)

İlk olarak bir transaction işlemi başlatmalıyız.

BEGIN TRAN[Section] [TransactionAdi]

Sonra Transaction içinde yapacağımız işlemlerimize geçelim.

DECLARE @HavaleTutari FLOAT
DECLARE @AliciHesabi VARCHAR(20), @GondericiHesabi VARCHAR(20) 

SET @AliciHesabi = '154875'
SET @GondericiHesabi = '698547'
SET @havaleMiktar = 100

-- 100TL havale yapıyoruz.

BEGIN TRANSACTION
UPDATE Hesaplar 
SET Bakiye = Bakiye - 100
WHERE hesapNo = @GondericiHesabi
UPDATE Hesaplar 
SET Bakiye = Bakiye + 100
WHERE hesapNo = @AliciHesabi

Daha sonra işlemlerin başarılı olduğunu gördüğümüzde COMMIT ifadesi ile işlemi sonlandırırız.

COMMIT

ROLLBACK işlemi için şöyle bir ifade kullanabiliriz.

IF @@ERROR<>0
    ROLLBACK
ELSE
    COMMIT

Burada herhangi bir işlem yaptığımızda herhangi bir adımda ERROR verirse ROLLBACK yapıyoruz. Ama hiç hata alınmamış ise COMMIT diyerek işlemleri sonlandırıyoruz.

Bugünlük bu kadar. Transactionlar aslında çok geniş bir konu ama diğer konularına daha sonra değineceğiz.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.