İçeriğe geç

NoLock ve With(Nolock) Arasındaki Fark

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

5 3 votes
Article Rating
Tarih:Microsoft SQL Server
Subscribe
Bildir
guest
2 Yorum
Eskiler
En Yeniler Beğenilenler
Inline Feedbacks
View all comments
sa as
sa as
4 yıl önce

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?

2
0
Would love your thoughts, please comment.x