Sql Server NOLOCK

SQL Server Nolock Nedir ve Nasıl Kullanılır

Bugün bir tablodan veri çekmeye çalıştığımda sorgunun cevap dönmediğini ve tabloyu blokladığını farkettim bunun nedenini araştırdım ve sizlerle de paylaşmak istedim.

Default da sql server bir transaction başlatıldığı zaman, ve transaction işlemi henüz tamamlanmadan, ilgili tablodan select ile veri çekmek istediğimizde,yanıtsız kalır ve bu durum da bloklamaya sebep olur.

Bunun sebebi bu tablodan veri okumak istediğimizde (select) burada işi bitmemiş olan bir “insert, update veya delete” işlemi olduğundan, ve henüz işlemler tamamlanmadığından dolayı o tablodaki veriler bloklanmaya sebep olur (transaction sonlanana kadar). Böyle durumlarda veri okurken with(nolock) komutunu kullanırsak transaction bitmemiş olsa dahi select sorgusunun çalıştırıldığı ana kadarki verileri getiririlir, ve arka tarafta transaction devam eder. Ama, bizim select sorgusunu çalıştırdığımız ana kadarki halini bize döndürür.

Örnek ile göstermek gerekirse; ben tabloma select attığım zaman aşağıdaki görselde de gördüğüm gibi session’ımın bloklandığını gördüm


sp_WhoIsActive ile arka tarafta çalıştırılan sorguları listeleme

Arka tarafta 22 saattir çalışan insert işleminin, veri çekmek istediğim tabloya insert ile veri eklediğini farkettim, bu durumda eğer

select * from [Tablo_adi]

şeklinde veri çekmeye çalışırsak değerin dönmediğini ve bloklandığını gördüm.

İşte bu durumlarda, o ana kadarki verilere ihtiyacımız varsa sorgunun çalıştırıldığı saniyedeki verilerin bize geri dönmesini istiyorsak Bunun için SQL Sorgu cümleciğimizde WITH (NOLOCK) deyimini kullanabiliriz.

SELECT * FROM Tablo_Adi WITH(NOLOCK)

DEZAVANTAJ

Bu durumda henüz tablo üzerinde yapılan transaction tamamlanmadığından, bu tür kayıtlara “kirli kayıt” ismi verilir. Bu durumda tablo üzerinde henüz işlem tamamlanmadığı için, transaction işlemini gerçekleştiren kişi işini bitirmeden “Rollback()”te yapabilir ve o attığım kayıtları/güncellemeleri iptal et de diyebilir.

Ama, biz o esnada select ile bu sorguyu çalıştırdıysak, o son değişikliği görmeden tüm kaydı çekmiş oluruz.

Normalde en doğru sonuç içintransaction işlemi tamamlandıktan sonra ilgili tablodan veri çekmemizdir. 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.

Bir cevap yazın

Kişisel Web sayfama hoş geldiniz..