Nolock Nedir?

Nolock Nedir?

Merhaba, bu yazımızda Sql Server da With Nolock ifadesini inceleyeceğiz. Sql Serverda bir tabloda herhangi bir kayıt üzerinde işlem yapıldığı zaman Sql Server tarafından bu tablo kilitlenmektedir. Buradaki amaç aynı anda birden fazla kullanıcının aynı veri üzerinde işlem yapmasını engellemektir. Şöyle bir senaryo düşünelim;
Bir tabloya kayıt eklendiği zaman başka bir kullanıcıda aynı tablodan aynı anda veri çekmek istesin. Bu durumda eğer kilitleme işlemi olmazsa ekleme işlemi daha bitmeden diğer kullanıcıda veri çektiği için elde ettiği kayıtlar doğru kayıtlar olmayacaktır. Bu kayıtlar Dirty Read olarak da geçmektedir. Bu gibi durumların önüne geçmek için Sql Server otomatik olarak kilitleme işlemini yapmaktadır. Aslında ilk bakışta gayet akla yatan bir durum söz konusudur aslında gerçekten de öyledir ama birçok kişinin aynı anda işlem yaptığı durumlarda bu kilitlenme süresini beklemek istemeyiz. İşte bu durumda With Nolock kullanmak işimizi görecektir.
With Nolock kilit işlemi olmadan kullanıcıların aynı tabloda aynı anda işlem yapabilmesine olanak sağlamaktadır. Birden fazla prosedürün aynı anda çalıştığı durumlarda, tablo kilitlendiğinde bile verileri çekme ihtiyacı duyduğumuzda kullanımı avantaj sağlamaktadır. Yani o an birinin işlem yapması önemli değil sen bana o anki veriler her neyse onları getir demekteyiz. Kullanımına gelecek olursa With Nolock ifadesini tablo dan sonra kullanabilmekteyiz. Örnek kullanım ise aşağıdaki gibidir.

SELECT * FROM dbo.Customers WITH (NOLOCK)

Bir transaction yapısı üzerinde inceleyecek olursak bir kullanıcının bakiyesine 1000 tl ekleyip gönderen kullanıcının bakiyesinden de 1000 tl düşme işlemini gerçekleştirelim.

İlk olarak tablomuzun ilk hali Şekil 1 deki gibidir.

Şekil 1

Daha sonra bir transaction içinde Can’ın bakiyesinden 1000 tl düşüp Ali’nin bakiyesine 1000 tl ekliyelim.

Şekil 2

Şekil 2 de görüldüğü gibi transaction ile Id değeri 1 olan kullanıcının bakiyesinden 1000 tl düştük daha sonra Id değeri 2 olan kullanıcının bakiyesini ise 1000 tl arttırdık. Messages kısmında görüldüğü gibi execute ile birlikte işlem başarıyla gerçekleşti fakat burda transactionı kapatmadık. Yani ne Commit Transaction diyip yapılan işlemi tamamladık ne de Rollback Transaction ile yapılan işlemi geri aldık. Şimdi bu durumda select sorgumuzu yeniden çağıralım.

Şekil 3

Tools kısmında da görüldüğü gibi transaction işlemini kapatmadığımız için sorgu sonlanmadı dolayısıyla select sorgusu sonucu tabloya ulaşamadık. İşte bu durumda nolock ifadesini kullanıp verileri getirebiliriz.

Şekil 4

With (Nolock) kullanarak tablomuzu beklemeden erişebildik. Bakiye vb. kritik olayların olmadığı durumda çok kayıtlı tablolarda bu kullanım bize fayda sağlayacaktır.

Tabloda da görüldüğü gibi bakiyeler güncellenmiştir fakat burda önemli husus transaction işlemini geri aldığımız durumdur. Parayı gönderme işlemini yaptık ama bir yerde bir sıkıntı olduğunu varsayalım ve işlemleri geri almak durumunda kaldığımızı düşünelim.

Şekil 5

Rollback işlemi ile transaction içinde yapılan işlemleri geri aldık. Yani mevcut bakiye durumlarımız Şekil 6 daki gibidir.

Şekil 6

Burada With (Nolock) kullanımının dezavantajını görmüş oluyoruz. Beklememek için bu ifadeyi kullandık ve o anki verileri getirdik ama biz işlemimizden vazgeçtik ve Rollback Transaction ile işlemi geri aldık. Yani işlemi geri aldığımız için güncel bakiyeler 1000 tl ve 2000 tl olması gerekirken biz With (Nolock) ile transaction bitmeden verileri aldık ve 0 tl ve 3000 tl değerlerini yani yanlış değerleri elde etmiş olduk.

Bu yazıda With (Nolock) kullanımını inceledik. İşimizi gören taraflarını anlatmakla beraber dezavantajınıda bir örnek üzerinde inceledik.

Gelecek yazılarda görüşmek üzere.

İyi çalışmalar.

Yorum bırakın