Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Apa yang menghalangi Select top 1 * from TableName dengan (nolock) mengembalikan hasil?

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server ARITHABORT

  2. Enkripsi Data Transparan (TDE) di SQL Server dalam Grup Ketersediaan AlwaysOn pada Contoh

  3. Cara mendapatkan nilai unik dari semua kolom tabel di SQL Server

  4. PDO sqlsrv:tidak dapat menemukan driver

  5. Keuntungan SQL Server 2008 dibandingkan SQL Server 2005?