(NOLOCK) so với NOLOCK


24

Tôi đang điều tra một số chặn khi tôi thấy một truy vấn trông giống như thế này:

SELECT SomeField FROM SomeTable NOLOCK

Tôi đã thấy NOLOCKvà tò mò làm thế nào nó có thể chặn các truy vấn khác, trong trường hợp này là các DELETEtuyên bố. Tôi đã xem nhanh các ổ khóa bằng cách sử dụng sp_lockvà đây là những gì tôi thấy:

DB      S   GRANT

TAB     IS  GRANT

PAG    S    GRANT

Bây giờ, sự hiểu biết của tôi là được cho NOLOCKlà chỉ sử dụng khóa Schema-Stability, tại sao sau đó lại lấy khóa IS?

Sự tò mò của tôi đã được khơi gợi. Tôi đã xem BOL và thấy có hai cách để sử dụng nó, WITH (NOLOCK)và không dùng nữa (NOLOCK), vì vậy tôi quyết định thử chúng. Tôi đã chạy các truy vấn sau theo sau bằng cách chạy sp_lock:

SELECT SomeField FROM SomeTable WITH (NOLOCK)
CẤP DB S

TAB Sch-S CẤP
SELECT SomeField FROM SomeTable (NOLOCK)
CẤP DB S

TAB Sch-S CẤP

Chắc chắn, có khóa Schema-Stability của tôi. Vì vậy, câu hỏi của tôi là: những gì đang xảy ra ở đây? Nếu cú pháp được chấp nhận cho việc sử dụng NOLOCK là một trong hai WITH (NOLOCK)hoặc (NOLOCK), thì tại sao không phải là lỗi truy vấn ra khi nó chạy với chỉ đơn giản NOLOCK(không có dấu ngoặc đơn)? Nếu nó được hỗ trợ, tại sao lại lấy khóa IS? Tôi đang thiếu gì ở đây? Tôi đã tìm kiếm trực tuyến để tìm câu trả lời, nhưng cho đến nay đã xuất hiện ngắn.

Tôi đã thử nghiệm điều này trên cả 2008R2 và 2012.


4
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)cho hiệu ứng nolock kép;)
ypercubeᵀᴹ

Câu trả lời:


52
SELECT SomeField
FROM   SomeTable NOLOCK 

có nghĩa là bạn vừa bí danh SomeTable AS NOLOCK. Hãy thử dưới đây để thấy rõ điều này:

SELECT NOLOCK.SomeField
FROM   SomeTable NOLOCK 

Điều này rõ ràng không có ảnh hưởng đến hành vi khóa của truy vấn. Truy vấn không thất bại vì mặc dù là từ khóa và hiển thị màu xanh lam trong SSMS, NOLOCK không phải là từ dành riêng trong Transact-SQL và do đó không gây ra lỗi cú pháp. Danh sách các từ dành riêng: https://msdn.microsoft.com/en-us/l Library / ms189822.aspx

Cú pháp đúng để sử dụng như một gợi ý:

  • (NOLOCK) có giá trị nhưng không được chấp nhận
  • WITH (NOLOCK) là cú pháp được đề xuất.

14
Wow, không chắc làm thế nào tôi không tìm ra điều đó. Nó thực sự khiến tôi phát điên, bây giờ tôi chỉ cảm thấy xấu hổ :) Đôi khi, đó là những điều đơn giản nhất, tôi đoán vậy.
Brian

2
@Brian Không phải lo lắng, tôi đã phải gỡ lỗi một cái gì đó rất giống gần đây, nếu không nó có thể không dễ dàng nhận ra! Bạn có thể thấy tại sao MS không dùng cú pháp đó.
Gareth Lyons

NOLOCK không phải là một từ khóa dành riêng? Không nên phàn nàn nếu bạn không sử dụng [NOLOCK]?
Aaroninus

6
Không, msdn.microsoft.com/en-us/l Library / ms189822.aspx Mặc dù nó xuất hiện với màu xanh lam trong SSMS có thể khiến bạn thất vọng.
Gareth Lyons

Bắt đẹp, LOL. Q / A yêu thích của tôi ngày hôm nay.
RBarryYoung
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.