Transaction ve Isolation Levels

Merhabalar.

–Çok önemli ve güzel bir konu öğreniyorum bugün, gel gel.

Transaction

Bütün olarak çalışması gereken komutlar için kullanılması gereken kontrol mekanizmasıdır.

Örnek : Markette kredi kartı ile alışveriş yapıyorsun, bunu yaparken 2 aşamalı bir işlemden geçiyor (tamamıyla sallıyorum belki 3 belki 5’tir bilmiyorum), alışveriş tutarının 100 TL olduğunu var sayar isek ;
1. Kredi kartının bakiyesinin düşmesi : UPDATE CREDIT_CARD SET BALANCE=(BALANCE-100) WHERE ID=1
2. Marketin hesabına geçmesi : UPDATE CUSTOMER_ACCOUNT SET BALANCE=(BALANCE+100) WHERE ID=1

Kasiyer kartı taktı parayı çekti ama 2. işlemde hata aldı yapamadı bu durumda senden para gitti, marketin hesabına da gelmedi. Para yok. İşte böyle anlarda transaction kullanılırsa işlem bir bütün olarak yapılır yada hiç yapılmaz.

Kullanımı ;

BEGIN TRY
BEGIN TRANSACTION
UPDATE CREDIT_CARD SET BALANCE=(BALANCE-100) WHERE ID=1
UPDATE CUSTOMER_ACCOUNT SET BALANCE=(BALANCE+100) WHERE ID=1
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH

 

Isolation Levels

Aynı anda data’lar üzerinde işlem yapan transaction’ların nasıl sonuç alacağını, hangi yolu izleyeceğini belirleyebildiğimiz seviyelerdir. Aynı anda işlemler yaparken karşımıza 4 tane sorun çıkabilir isolation level’lara geçmeden önce bu sorunlara bir bakayım ki neden yapmam gerektiğini anlayabileyim.

Lost Updates: Aynı zamanda birden fazla transaction bir data üzerinde işlem yapar ise, işlemi en son yapan/bitiren geçerli olur. Bu durumda data loss yaşanabilir.
Dirty Reads: Bir transaction data üzerinde değişiklik yapmış ancak COMMIT etmemiş yani ben bu işlemi bitirdim bu doğrudur diyemeden başka bir transaction’un değişiklik yapılmış data’yı doğru data olarak göstermesidir.
Non-Repeatable Reads: Bir transaction bir data’yı okuyup ve işleme alıyor. Bu transaction COMMIT etmeden başka bir transaction bu data’yı okusun. Daha sonra işlem yapan transaction tekrar data’yı okumak istediğinde data aynı data olmayacağı için sorun yaşanmaktadır.
Phantom Reads: Aynı anda çalışan iki transaction’dan 1.si tablo’ya SELECT atıyor ve data’yı alıyor, 2.si ise aynı tabloya INSERT giriyor. 1. Transaction tekrar SELECT attığında sonradan gelen INSERT’leri hayalet data olarak görür.

6 tane Isolation Level vardır;

Read Uncommited – Level 0 : Adı üzerinde Transaction tarafından COMMIT edilmemiş dahi olsa data’yı gösterir, yani sonrasında Transaction hata alıp Rollback yapacak olsa elinde yanlış data olacaktır. Bu sebeple yanlış data çekme olasılığı olan bir Level’dır. Dirty Read sorunu bu level’de ortaya çıkar.
Nasıl kullanılır?
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
Read Commited – Level 1 : SQL SERVER ‘da default Isolation Level’ dır. Data’ya bir transaction uygulanıyorsa diğer transaction’ları bekletir. Dirty Read sorununu ortadan kaldırır ancak bu seferde Lost Updates sorunu ortaya çıkar. Aynı alana iki kez update yapılacaksa biri bitmeden diğerini yaptırmaz. Ancak işlemi en son bitirenin yaptığı güncelleme geçerli olacağından Lost Updates yaşanır.
Nasıl kullanılır?
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Repeatable Read Level 2 : Yine bir data’ya transaction uygulandığını varsayalım, bu sırada başka bir transaction, ilk transaction’ın aldığı data’yı güncelledi. Bu durumda ilk transaction güncellenen data’yı işleme alacağından yanlış sonuç verecektir. Bunu engellemek için bu level kullanılabilir. Bu level’de üzerinde işlem yapılan data okunamaz ancak asıl ama data’nın güncellenmemesidir. Bu levelde Lost Updates, Dirty Reads, Non-Repeatable Reads sorunları ortadan kalkar, ancak Phondam Reads baş gösterir :))
Nasıl kullanılır?
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
Serializable Level 3 : İşlemleri seriye bağlayan level’dir. Bir Transaction data üzerinde işlem yapıyor ise (update,delete,insert) data’yı kapatır başka hiç bir Transaction işlem yapamaz. Bu sayede bütün sorunlar ortadan kalkar. Her güzelin bir kusuru olduğu gibi, bu level’de işlemler sıraya alınacağı birbirlerini bekleyeceği için kuyruk uzar, işlemler gecikir, performans düşer.
–Vur dediler öldürdüm bende 🙂
Nasıl kullanılır?
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

Bunlar biraz değişik sonradan gelmişler.
Read Commited Snapshot Isolation : Uygulandığında tek bir transaction’a değil bütün database üzerinde uygulanır. Shared Lock özelliğini ortadan kaldırır. Bir Transaction UPDATE yaparken başka bir Transaction SELECT atabilir. Bunu nasıl mı yapıyor? UPDATE eden Transaction, data’nın COMMIT edilmemiş halinin SNAPSHOT’ını tempdb‘ye yazar bu sayede SELECT data’yı okuyabilir.
Nasıl kullanılır?
ALTER DATABASE Northwind SET READ_COMMITTED_SNAPSHOT ON
Snapshot Transaction Isolation : Burada da diğer SNAPSHOT’ta tüm database üzerinde uygulanan level Transaction bazlı uygulanmaktadır.
Nasıl kullanılır?
ALTER DATABASE Northwind SET ALLOW_SNAPSHOT_ISOLATION ON
SET TRANSACTION ISOLATION LEVEL SNAPSHOT

Leave a Comment.