NoLock Nedir? Ne işe yarar ve de tabii ki NoLock ve With(Nolock) Arasındaki Fark?
Aslında her ne kadar Microsoft 2016 ve sonrasıyla birlikte bu farkı ortadan kaldıracağını açıklamış olsa bile şu an 2017 dahil with(nolock) şeklinde kullanım devam etmektedir.
Peki Nedir With(Nolock)? Ne İşe Yarar?
Bilindiğini varsaydığım üzere (ki daha sonra makalesini de yazacağım) Sql’de Transaction diye bir kavram var. Yani siz açmış olduğunuz bir transaction ile yine kendiniz o transaction’ı bitirene kadar ilgili tabloya atılan select’ler yanıtsız kalır. Ve tabii ki meşhur “deadlock victim” ile başlayan bir hatayla karşılaşırsınız. Bu da şu demektir;
Arkadaşım, sen bu tablodan veri okumak istiyorsun ancak burada daha işi bitmemiş olan bir “insert, update veya delete” işlemi var. Yani daha o tablo kendisi, verileri konusunda net değil ki ben sana oradan kayıt getireyim. 🙂
Bu durumda da işte devreye with(nolock) komut eklentisi girer. Burada da biz demiş oluyoruz ki;
Arkadaşım, önemli değil sen henüz bitmemiş olsa da orada tam da bu saniyede ne var ne yok sen getir bana. Bırak oradaki işlem devam etsin ve ben onu göremeyeyim sorun değil. 🙂
Yani aslında Öz Türkçe ile tam da bu senaryo gerçekleşir.
Dezavantajları
Yazılım ve DB camiasında ise buna “kirli kayıt” ismi verilir. Zira orada daha işlem bitmediği için, işlemi yapmakta olan şahıs aslında işini bitirmeden “Rollback()”te yapabilir. Yani herşeyden vazgeçip, o attığım kayıtları/güncellemeleri iptal et de diyebilir SQL’e. Ama biz o arada select ile bu sorguyu çalıştırdıysak malesef o son değişikliği görmeden tüm kaydı çekmiş oluruz. Tabii ki en stabil olan işlemin bitmesi ve bizim ondan sonra select işlemini gerçekleştirmemizdir. Ancak kimi zaman öyle durumlar oluşur ki o devam eden işlemi bekleyemeyecek veya takip edemeyecek durumda olabilir. Bu gibi durumlarda işte devreye with(nolock) komut eki girer.
NoLock ile With(NoLock) Farkları
Yukarıda da bahsettiğim gibi aslında Microsoft’un kati suretle önerisi with(nolock) şeklinde bir kullanımdır. Zira SQL Server 2016 ve sonrasıyla bu farkı kaldıracağını belirtmiş olsa dahi şu an 2017’de dahi bu farkı kaldırmamıştır. Bir sorguya sadece “nolock” eklediğinizde hata almazsınız. Ancak asıl işi olan açık transaction’ın arasına girme vazifesini maalesef yerine getirmez. Bu yüzden hala daha nolock komutunu with(nolock) şeklinde yazmamız gerekmektedir.
Kullanım Örnekleri;
Select * from Ogrenciler with(nolock)
Select * from Ogrenciler with(nolock) where Id = 17
Select * from Ogrenci with(nolock) inner join Ogretmen with(nolock) on Ogrenci.OgrtId = Ogretmen.Id where Ogretmen.Id = 6
Nolock komutunun (başında WITH olmadan) ne işe yaradığını yazmamışsınız, yalnızca “asıl işi olan açık transaction’ın arasına girme vazifesini maalesef yerine getirmez” demişsiniz. Bu Nolock ifadesinin SQL ‘de hiç bir işe yaramadığı, boş yere eklenen bir kod olduğu anlamına mı geliyor?
Aslında durumu şöyle belirtmek daha doğru olacak belki. With bilindiği üzere birliktelik anlamı taşır. Yalnızca nolock işlemi için kullanılmaz başka işlemler için de kullanılabilmektedir.
Örn;
Dolayısı ile “with nolock” şeklinde kullanıldığında o tablo ile birlikte kilidi kaldırarak çalışacağı şekilde kullanılmış. Nolock komutu tek başına bomboş bir db’de çalışıyor gibi görünse de, üzerinde gerçekten o an transaction’ların döndüğü bir tabloda çalışmamaktadır. Yani lock’dan arındırarak sonuç dönmemektedir. Bu neden ile with(nolock) şeklinde kullanılmaktadır.