Blog

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

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 = ‘dnsadresi’
    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=’dnsadresi’ 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.

1234567CREATE 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.

1BEGIN TRAN[Section] [TransactionAdi]

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

12345678910111213141516DECLARE @HavaleTutari FLOATDECLARE @AliciHesabi VARCHAR(20), @GondericiHesabi VARCHAR(20) SET @AliciHesabi = ‘154875’SET @GondericiHesabi = ‘698547’SET @havaleMiktar = 100— 100TL havale yapıyoruz.BEGIN TRANSACTIONUPDATE Hesaplar SET Bakiye = Bakiye – 100WHERE hesapNo = @GondericiHesabiUPDATE Hesaplar SET Bakiye = Bakiye + 100WHERE hesapNo = @AliciHesabi

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

1COMMIT

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

1234IF @@ERROR<>0    ROLLBACKELSE    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.

No Comments

Cevapla

Tüm sorularınız için bize yazabilirsiniz.

İLETİŞİM BİLGİLERİ



Sektör ile ilgili tüm sorularınız için bizim ile iletişime geçebilirsiniz.

Telefon:

+90 850 307 0 736
+90 532 433 0 736

WhatsApp:

+90 850 346 4 736

Merkez Adres:

Barbaros Mahallesi Ihlamur Bulvarı Ağaoğlu My Newwork No:3
Ataşehir/İstanbul – Türkiye

Anadolu Temsilciliği:

Gaziosmanpaşa Üniversitesi Teknopark Yerleşkesi K:2
Merkez/Tokat – Türkiye