SELECT
kueri dengan NOLOCK
sebenarnya tidak mengambil kunci, mereka masih membutuhkan SCH-S
(stabilitas skema) kunci di atas meja (dan karena ini adalah heap itu juga akan membutuhkan hobt
kunci
).
Selain itu sebelum SELECT
bahkan dapat memulai SQL Server harus mengkompilasi rencana untuk pernyataan tersebut, yang juga mengharuskannya untuk mengambil SCH-S
kunci di atas meja.
Saat transaksi berjalan lama Anda membuat tabel melalui SELECT ... INTO
itu memegang SCH-M
yang tidak kompatibel menguncinya sampai pernyataan selesai.
Anda dapat memverifikasi ini dengan melihat di sys.dm_os_waiting_tasks
sementara sementara selama periode pemblokiran.
Ketika saya mencoba yang berikut ini dalam satu koneksi
BEGIN TRAN
SELECT *
INTO NewT
FROM master..spt_values
/*Remember to rollback/commit this later*/
Dan kemudian mengeksekusi (atau hanya mencoba melihat perkiraan rencana eksekusi)
SELECT *
FROM NewT
WITH (NOLOCK)
dalam sedetik permintaan membaca diblokir.
SELECT wait_type,
resource_description
FROM sys.dm_os_waiting_tasks
WHERE session_id = <spid_of_waiting_task>
Menunjukkan tipe menunggu memang SCH_S
dan sumber daya pemblokiran 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