SQL Server'daki işlemlerin izole seviyesi ve bunların kirli okumalar, tekrarlanmayan okumalar, hayali okumalar vb. (kod argümanları ve zaman dizileri gibi) ile ilişkisi.
Veritabanına eşzamanlı erişim durumunda ortaya çıkabilecek bu sorunları anlarak, veritabanı izolasyon seviyesi kavramını daha iyi anlamaya devam edebiliriz: eşzamanlı işlemleri nasıl izole etmek istersiniz ve ne ölçüde olur? Örneğin, kirli okumalar tolere edilebiliyorsa veya eşzamanlı işlemlerin kirli okuma olmasını istemiyorsanız, bunlar izolasyon seviyesine ayarlanabilir ve eşzamanlı işlemler arasındaki izolasyon gevşek veya ciddi hale getirilebilir.
İzolasyon seviyesi ne kadar yüksekse, kirli veya eksik veri okuma olasılığı o kadar düşüktür, ancak yüksek eşzamanlılık sistemlerinde performans bozulması o kadar şiddetlidir. İzolasyon seviyesi ne kadar düşükse, eşzamanlı sistemde performans artışı o kadar büyük olur, ancak veri eksik olabilir.
SQL Server 2012'de, bir işlemin izolasyon seviyesini (düşükten yükseke) şu sözdizimi kullanarak ayarlayabilirsiniz:
IŞLEM IZOLASYON SEVIYESINI AYARLAYIN { OKU KARARSIZ | OKUMA TAAHHÜDÜ | TEKRARLANABILIR OKUMA | ANLIK GÖRÜNTÜ | SERILEŞTIRILEBILIR } [ ; ] Öncelikle, yeni bir test betiği oluşturun, bir veritabanı oluşturun ve test verisini aşağıdaki gibi ekleyin:
Yeni bir pencere A oluşturun, bir işlem aç, güncelleme işlemini gerçekleştirir ve commit yapmadan önce 10 saniye beklerken, kod şu şekildedir:
Yeni bir pencere B oluşturun, işlemi READ UNCOMMITTED (taahhüt edilmemiş okuma, en düşük seviye, kolay sorun kirli okumadır, çünkü diğer işlemler tarafından değiştirilen verileri okuyabilir ancak taahhüt edilmemiştir.) Bir işlemde SELECT ifade nesne tablosunda (NOLOCK) ayarlamakla aynı şeyi yapar. Verileri sorgulayınca, kod aşağıdaki gibidir:
Yeni bir C penceresi oluşturun, veriyi doğrudan sorgulayın, aşağıdaki gibi:
Karşılığında,A, B ve C pencerelerini çalıştırın ve veri güncellerken, pencere B'nin hemen veriyi döndürebileceğini görün (Okumanın kirli veri olması mümkün), C penceresi A penceresinin yürütülmesini beklemesi gerekiyoraşağıdaki şekilde gösterildiği gibi verileri döndürecektir:
(Pencere B)
(Pencere C)
(Son)
|