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 NOLOCK
và 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 DELETE
tuyên bố. Tôi đã xem nhanh các ổ khóa bằng cách sử dụng sp_lock
và đâ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 NOLOCK
là 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.
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)
cho hiệu ứng nolock kép;)