READ_COMMITTED_SNAPSHOT ve SNAPSHOT ISOLATION LEVEL


Oracle kökenli olup şimdi SQL Server yöneten ya da SQL Server da yöneten DBA’ler SQL Server 2005’le gelen bu iki özelliğe bayılacak.

READ_COMMITTED_SNAPSHOT bir veritabanı opsiyonu. Seçilince tüm veritabanında geçerli oluyor. Veritabanında çalışan SELECT’lerin paylaşılan kilit koymamasını, bunun yerine çalıştırıldıkları andaki satır bilgilerini satır versiyonlarına güvenerek okumasını sağlıyor.

SELECT’ler paylaşılan kilit koymadıkları için UPDATE’ler onları beklemek zorunda kalmıyor. SELECT’ler de okudukları datanın tutarlı olması için değiştirilmiş satırların kendileri başladığı handaki orijinal halini okuyorlar. Performans açısından hoş, ama bence daha önemlisi, Oracle kökenli DBA ya da programcıların alışık olduğu bir davranış modelini SQL Server tarafında gerçeklemesi.

SNAPSHOT ISOLATION da aynı çalışma şeklini transaction bazında getiriyor. Transaction isolation levelını böyle seçerseniz, ilgili transaction içinde SELECT’lerin davranışı tarif ettiğim şekilde gerçekleşiyor.

Oracle kökenliler konuyu hemen anlamıştır. SQL Server kökenli olup konuyu karışık bulanlar daha detaylı açıklama isterlerse yorum ekleyerek sorularını sorabilirler.

Not: SNAPSHOT ISOLATION kullandığınızda, SELECT’lerin gördüğü veri versiyonu kendilerinin çalıştırıldıkları an değil, transactionın ilk başladığı andır.

Bu yazı SQL Server içinde yayınlandı. Kalıcı bağlantıyı yer imlerinize ekleyin.

6 Responses to READ_COMMITTED_SNAPSHOT ve SNAPSHOT ISOLATION LEVEL

  1. IŞIL PEKTAŞ dedi ki:

    Mustafa Bey ,Bizim projemizde read commited isolation level kullanılmakta.Fakat bircok yerde bekleme yaşanmaması için (with nolock) ekliyoruz.Isolation level i read_commited_snapshot yaparsak eger,uygulamada son değerin görünmesi gereken yerlere hangi table hintini kullanmamız gerekir?Teşekkürler

  2. Mustafa Acungil dedi ki:

    Read committed snapshot kullanmanız durumunda, zaten geçerli en son değeri görmüş olursunuz. Yani ya o an kilit yoktur ve o an geçerli değeri görürsünüz, ya da o an kilit vardır ve bir önceki commit olmuş değeri görürsünüz.Beklemeniz hiç gerekmeyeceği için (en azından okuyucular yazıcıları beklemesi gerekmeyeceği için) beklememek için hint kullanmanıza gerek yok. Değişmekte olan bir değeri dışarıdan görmekse zaten sağlıklı değil. Ama yine de eğer değişmekte olan değeri görmek isteyeceğiniz bir transaction olacaksa, o transaction için read uncommitted isolation mode'unu uygulayabilirsiniz.Read committed snapshot'a database'i ayarladıktan sonra, özel ayar yapmadığınız tüm transactionlar default olarak read committed snapshot'ta çalışacaktır.

  3. IŞIL PEKTAŞ dedi ki:

    Mustafa Bey,Açıklamalarınız için teşekkür ederim..

  4. IŞIL PEKTAŞ dedi ki:

    Mustafa Bey,Read committed snapshot kullanılma durumunda herhangi bir bekleme olmayacak,anladığım kadarıyla mesela rezervasyon ekranında aynı kayıda erişen kullanıcıların hepsi işlem yapabilecek.Bu gibi durumlarda lock lı kayıdın commitlenmiş halini görmek ıcın nasıl bir yol izlenmelidir sizce?

    • Mustafa Acungil dedi ki:

      Rezervasyon gibi kısıtlı kayıtların özel erişiminde pessimistic concurrency kullanmayı tercih edebilirsiniz. Optimistic concurrency’de kaynakların kıt olmadığı varsayılır, işlem yapmaya başlarken kilit konulmaz, işlemin bitimi teyit edilirken uygunsuz bir durum var mı diye kontrol edilir. Ama kaynakların kıt olduğu durumda, niyetlendiğinizde kilidi koyarsınız.

      Sisteminizde kaynakların kıtlığı sözkonusuysa, read committed snapshot yerine mesela read committed’ı kullanmayı tercih edebilirsiniz.

      “locklı kaydın commitlenmiş hali” ile kastınız nedir? Birinci transaction kilitlemiş ise, ikinci transaction (read committed snapshot’ta) zaten bir önceki commitlenmiş halini görüyor. Ama sanırım sizin kastınız başka?

  5. Geri bildirim: CreaCity.Net – SQL 2016 Geçişi, ColumnStore Index ve Memory Optimized Tablolar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s