msHOWTO

9 Mayıs 2012 Çarşamba

Sql Server Transaction Isolation Levels

Merhaba arkadaşlar. Bu makalemde sizlere transaction ile ilgili oldukça önemli konu olan Isolation Levels 'ı anlatacağım.Daha önceki makalelerimde transaction ı nasıl kullanacağımızı neden kullanacağımızı detaylı olarak anlatmıştım.Bu makalemde anlatacağım konu transaction ları izolasyon etme seviyelerinden bahsedeceğim.Yani diğer bir deyişle aynı anda aynı veriler üzerinde çalışan transaction ların nasıl çalışacaklarını veya nasıl sonuçlar alacaklarını belirleyebildiğimiz seviyelerden bahsedeceğim.

Öncelikle native yani tüm veri tabanı sistemlerinin kabul ettiği 4 adet isolation level lar vardır.Fakat MSSQL Server ise bize bunlara ek olarak 2 adet isolation level sağlamaktadır.

1-)Read Uncommited(level 0)
2-)Read Commited(level 1)
3-)Repeatable Read(level 2)
4-)Serializable(level 3)

Bunlara ek olarak Mssql in bizlere sağladıkları ise ;

1-)Read Commited Snapshot Isolation
2-)Snapshot Transaction Isolation

Yukarıdaki isolation level ları incelemeden önce ortak zamanlı erişim sorunlarını anlatmak istiyorum arkadaşlar.Nedir ortak zamanlı erişim sorunları?Aynı anda birden fazla transaction ın veya session ın aynı veri üzerine erişmek istemesi ve işlem yapmak istemesi sırasında ortaya çıkabilecek olan sorunlardır.4 adet sorun karşımıza çıkmaktadır.

1-) Lost Updates:Aynı anda birden fazla transaction aynı anda bir veri üzerinde güncelleme yapmak istediği zaman en son işlem yapan transaction ın kaydı geçerli olur.Bu yüzden veri kaybı yaşanır.

2-)Dirty Reads:Bir transaction ın bir veri üzerinde yapmış fakat commit etmemiş olduğu bilgileri diğer transaction tarafından gerçek kayıtmış gibi okuması durumudur.

3-)Non-Repeatable Reads:Bir transaction bir veriyi okusun ve kendi içinde işleme soksun.Bu transaction commit etmeden başka bir transaction bu veriyi okusun.Daha sonra işlem yapan transaction tekrar veriyi okumak istediğinde veri aynı veri olmayacağı için sorun yaşanmaktadır.

4-)Phantom Reads:Aynı anda çalışan transaction düşünelim.Bir transaction bir tablodaki verilerin tamamını çeksin ve kendi içindeki işleme soksun.Bu sırada da diğer transaction aynı tabloya veri ekleme işlemi yapsın.Daha sonra ilk transaction tekrar verileri çekmek istediğinde yeni eklenen veriler hayalet veri olarak görünür.

İşte tüm bu sorunlara çözüm olarak isolation level lar vardır.Hadi gelin şimdi onları inceleyelim arkadaşlar.

Read Uncommited

      Bir veri üzerinde bir kullanıcı transaction yaparken diğer kullanıcılarında değişikliğe uğramış fakat commit edilmemiş verileri görebilmesini sağlayan level'dır.Bu durum bize performans sağlar fakat verimizin güvenliğini elimizden alır neredeyse.Çünkü ya yapılan transaction commit edilmezse yani bir hata oluşur ve tüm yaptığı işlemleri rollback yaparsa ne olacak ? İşte bu durumda ortaya çıkan soruna Dirty Read denilir.Yani kısacası bir transaction işlemi yapılırken commit edilmese dahi diğer kullanıcılar transaction ın yaptığı işlemlerin sonucunu transaction sırasında görebilirler.Dirty reads,lost updates,non-repeatables reads ve phantom reads sorunları vardır.

Peki bu level ı nasıl kullanacağım ? 

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED


Yukarıdaki gibi sql komutu ile oldukça basit bir şekilde aktif hale getirebiliriz.

Read Commited

     Bu level da ise eğer bir veri üzerinde transaction uygulanıyorsa diğer transactionların bu veriye erişmesini engeller.Sql server'ın default level ı budur arkadaşlar.Daha önce denediniz mi bilmiyorum fakat eğer bir veri üzerinde bir tansaction işlemi yapılıyor ise sql server da o veriye erişim engellenir.Peki bu sırada diğer sorgular veya transactionlar ne olacak ? Veri üzerindeki transaction'ın sonlanmasını beklemekten başka hiç bir şansları yok :)Read Uncommited ın ortaya çıkardığı dirty read sorununu ortadan kaldırır.Fakat losts updates sorunu vardır.

Peki bu level ı nasıl kullanacağım ? 

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

Yukarıdaki gibi sql komutu ile oldukça basit bir şekilde aktif hale getirebiliriz.

Repeatable Read

     Diyelim ki bir transaction işlemleri arasında bir veriyi çekti ve işlem yapmaya başladı.İşlemini tamamlamadan yani commit edilmeden bir başka transaction veya kullanıcı o verideki değeri değiştirdi.Transaction işlemlerini yaparken tekrardan o veriyi okuyup değerini almak istedi.Eee veri eski veri değil. Doğal olarak transaction'ın işlemlerinin sonucu yanlış çıkacaktır.İşte bu sorunu ortadan kaldırmak için bu level kullanılmaktadır.Yani kısaca bir transaction tarafından kullanılan veri diğer transaction tarafından okunamaz.Fakat buradaki asıl amaç bir transaction tarafından okunan ve kullanılan verinin değiştirilmemesidir.Bu sayede dirty reads,lost updates,non-repeatables reads sorunları ortadan kalkar.Fakat phantom reads sorunu vardır.

Peki bu level ı nasıl kullanacağım ? 

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ


Yukarıdaki gibi sql komutu ile oldukça basit bir şekilde aktif hale getirebiliriz.

Serializable

    Veri ekleme,silme ve güncelleme yapan transaction boyunca veri erişime kapanır.Bu sayede hiç bir ortak zamanlı sorun ortada kalmaz.Fakat işlemler çok fazla birikir.Bu da bize performans sorunu yaşatır.

Peki bu level ı nasıl kullanacağım ? 

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

Yukarıdaki gibi sql komutu ile oldukça basit bir şekilde aktif hale getirebiliriz.

Read Commited Snapshot Isolation

      Bu level da Read Commited level da oluşan Shared Lock durumu ortadan kalkar.Yani bir transaction bir veride güncelleme yaparken bir başka transaction bu veriyi okuyabilir.Bir transaction içerisinde kalmış ve commit edilmemiş verilerin tempdb veritabanına snapshot larını kaydeder.Böylece diğer transactionların verileri okuması sağlanmaktadır.
Kullanılabilmesi için database seviyesinde READ_COMMITTED_SNAPSHOT parametresinin "on" konumunda olması gerekmektedir.Default olarak "off" ayarlanıktır.

ALTER DATABASE Northwind SET READ_COMMITTED_SNAPSHOT ON

Olarak kullanılır.

Snapshot Transaction Isolation

    Bir üstteki level dan tek farkı burada yapılan konfigurasyonun transaction bazında olmasıdır.
Kullanımında öncelikle database seviyesinde ayar yapılması gerekir.

ALTER DATABASE Northwind SET ALLOW_SNAPSHOT_ISOLATION ON

Daha sonra ise transaction seviyesinde ayarlama yapılması gerekmektedir.

SET TRANSACTION ISOLATION LEVEL SNAPSHOT


Evet arkadaşlar umarım faydalı olmuştur.Bir sonraki makalemde görüşmek dileğiyle...

12 yorum:

  1. güzel bir yazı tebrikler.

    YanıtlaSil
    Yanıtlar
    1. Teşekkür ederim ... İşinize yaradıysa sevindim

      Sil
  2. Güzel ve açıklayıcı bir yazı olmuş Elinize sağlık.

    YanıtlaSil
    Yanıtlar
    1. Rica ederim. Yardımcı olmuştur umarım

      Sil
  3. Teşekkürler Yazınız gerçekten çok faydalı benzer yazıların devamını bekleriz.

    YanıtlaSil
    Yanıtlar
    1. Beğenmenize gerçekten sevindim. Kesinlikle yazilarimin devami gelecek.

      Sil
  4. Kesinlikle Türkiye' deki bu konudaki en başarılı ve sunum şeklinde yapılabilecek, makale düzeyinde bir emek... Tebrik ederim arkadaşım.

    YanıtlaSil
    Yanıtlar
    1. Beğenmenize ve guzel yorumunuza tesekkur ederim

      Sil
  5. tesekkurler yardımcı oldu paylaşımınız.. emeğinize sağlık

    YanıtlaSil
  6. Merhaba read uncommited ile read committed sorgularını ters yazmışsınız gibi geldi bana

    YanıtlaSil
  7. SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED
    ters olmus..

    YanıtlaSil
    Yanıtlar
    1. Merhabalar , Doğru diyorsunuz. Gerekli düzenlemeleri yaptım.

      Sil