Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Điều gì đang chặn Chọn top 1 * từ TableName với (nolock) trả về kết quả?

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tối ưu hóa việc sử dụng mệnh đề OR khi được sử dụng với các tham số (SQL Server 2008)

  2. Tại sao (và cách) chia cột bằng cách sử dụng master..spt_values?

  3. Công cụ miễn phí để so sánh hai Cơ sở dữ liệu SQL Server là gì?

  4. SQL - Nối các bảng trong đó một trong các cột là danh sách

  5. Khóa lạc quan so với bi quan