(NOLOCK) vs NOLOCK


24

Buna benzeyen bir sorgu gördüğümde bazı engellemeleri araştırıyordum:

SELECT SomeField FROM SomeTable NOLOCK

NOLOCKBu durumda, diğer soruları nasıl engelleyebileceğini merak ettim ve merak ettim DELETE. Kullanarak kilitlere hızlıca baktım sp_lockve işte gördüğüm şey:

DB      S   GRANT

TAB     IS  GRANT

PAG    S    GRANT

Şimdi, benim anlayışım bunun NOLOCKsadece bir Şema-Stabilite kilidi alması gerektiği, neden bir IS kilidi kapmasıydı?

Merakım kesildi. BOL'a baktım ve onu kullanmanın iki yolu olduğunu gördüm WITH (NOLOCK)ve kullanımdan kaldırıldı (NOLOCK), bu yüzden denemeye karar verdim. Aşağıdaki sorguları çalıştırarak izledim sp_lock:

SELECT SomeField FROM SomeTable WITH (NOLOCK)
DB S HİBE

TAB Sch-S HİBE
SELECT SomeField FROM SomeTable (NOLOCK)
DB S HİBE

TAB Sch-S HİBE

Tabii ki, Şema-Stabilite kilitlerim var. Öyleyse benim sorum şu: burada neler oluyor? NOLOCK kullanmak için kabul edilen sözdizimi ya WITH (NOLOCK)da ya da (NOLOCK)öyleyse, sorgu neden yalnızca düz NOLOCKparantez (parantez olmadan) kullanıldığında hata vermiyor ? Destekleniyorsa, neden bir IS kilidi alıyor? Burada neyi özlüyorum? Ben bir cevap için çevrimiçi arama yapıyorum, ancak şimdiye kadar kısa geldi.

Bunu hem 2008R2 hem de 2012'de test ettim.


4
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)çift ​​burun etkisi için;)
ypercubeᵀᴹ

Yanıtlar:


52
SELECT SomeField
FROM   SomeTable NOLOCK 

Sadece takma adın var demek SomeTable AS NOLOCK. Bunu açıkça görmek için aşağıyı deneyin:

SELECT NOLOCK.SomeField
FROM   SomeTable NOLOCK 

Bu açıkça sorgunun kilitleme davranışını etkilemez. SSMS'de bir anahtar kelime ve mavi gösterilmesine rağmen, NOLOCK, Transact-SQL'de ayrılmış bir kelime olmadığı ve bu nedenle bir sözdizimi hatasına neden olmadığı için sorgu başarısız . Ayrılmış kelimelerin listesi: https://msdn.microsoft.com/en-us/library/ms189822.aspx

Bir ipucu olarak kullanmak için doğru sözdizimi:

  • (NOLOCK) geçerli ancak kullanımdan kaldırıldı.
  • WITH (NOLOCK) önerilen sözdizimi.

14
Vay, bunu nasıl çözemediğimden emin değilim. Bu beni gerçekten delirtiyordu, şimdi sadece utanıyorum. :) Sanırım en basit şeyler.
Brian

2
@Brian Endişeye gerek yok, son zamanlarda çok benzer bir şeyi ayıklamak zorunda kaldım, aksi halde tespit etmek o kadar kolay olmayabilir! MS'in neden bu sözdizimini reddettiğini görebilirsiniz.
Gareth Lyons,

NOLOCK ayrılmış bir anahtar kelime değil mi? [NOLOCK] kullanmazsanız şikayet etmemeli mi?
Aaroninus,

6
Hayır msdn.microsoft.com/en-us/library/ms189822.aspx SSMS'de sizi fırlatabilecek mavi görünmesine rağmen.
Gareth Lyons,

İyi yakaladın, LOL. Bugün en sevdiğim Q / A.
RBarryYoung
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.