SELECT
truy vấn với NOLOCK
không thực sự mất khóa, họ vẫn cần SCH-S
(độ ổn định của giản đồ) khóa trên bảng ( và nó là một đống nó cũng sẽ mất một hobt
khóa
).
Ngoài ra trước SELECT
thậm chí có thể bắt đầu SQL Server phải biên dịch một kế hoạch cho câu lệnh, điều này cũng yêu cầu nó phải nhận SCH-S
khóa trên bàn.
Khi giao dịch đang diễn ra trong thời gian dài của bạn sẽ tạo bảng thông qua SELECT ... INTO
nó chứa SCH-M
không tương thích khóa nó cho đến khi câu lệnh hoàn thành.
Bạn có thể xác minh điều này bằng cách xem trong sys.dm_os_waiting_tasks
trong khi trong khi trong thời gian bị chặn.
Khi tôi thử những điều sau trong một kết nối
BEGIN TRAN
SELECT *
INTO NewT
FROM master..spt_values
/*Remember to rollback/commit this later*/
Và sau đó thực hiện (hoặc chỉ đơn giản là cố gắng xem kế hoạch thực hiện ước tính)
SELECT *
FROM NewT
WITH (NOLOCK)
trong một giây, truy vấn đọc đã bị chặn.
SELECT wait_type,
resource_description
FROM sys.dm_os_waiting_tasks
WHERE session_id = <spid_of_waiting_task>
Cho thấy kiểu chờ thực sự là SCH_S
và tài nguyên chặn SCH-M
wait_type resource_description
---------------- -------------------------------------------------------------------------------------------------------------------------------
LCK_M_SCH_S objectlock lockPartition=0 objid=461960722 subresource=FULL dbid=1 id=lock4a8a540 mode=Sch-M associatedObjectId=461960722