Saya sedang menyelidiki beberapa pemblokiran ketika saya melihat permintaan yang terlihat seperti ini:
SELECT SomeField FROM SomeTable NOLOCK
Saya melihat NOLOCK
dan ingin tahu bagaimana bisa memblokir pertanyaan lain, dalam DELETE
pernyataan kasus ini . Saya melihat sekilas kunci menggunakan sp_lock
dan di sini adalah apa yang saya lihat:
DB S GRANT
TAB IS GRANT
PAG S GRANT
Sekarang, pemahaman saya adalah bahwa NOLOCK
seharusnya hanya mengambil kunci Skema-Stabilitas, mengapa kemudian mengambil kunci IS?
Keingintahuan saya terusik. Saya mencari di BOL dan melihat ada dua cara untuk menggunakannya, WITH (NOLOCK)
dan usang (NOLOCK)
, jadi saya memutuskan untuk mencobanya. Saya menjalankan pertanyaan berikut yang ditindaklanjuti dengan menjalankan sp_lock
:
SELECT SomeField FROM SomeTable WITH (NOLOCK)
DB S GRANT TAB Sch-S GRANT
SELECT SomeField FROM SomeTable (NOLOCK)
DB S GRANT TAB Sch-S GRANT
Benar saja, ada kunci Skema-Stabilitas saya. Jadi pertanyaan saya adalah ini: apa yang terjadi di sini? Jika sintaks yang diterima untuk menggunakan NOLOCK adalah salah satu WITH (NOLOCK)
atau (NOLOCK)
, lalu mengapa query tidak keluar ketika dijalankan dengan hanya polos NOLOCK
(tanpa tanda kurung)? Jika didukung, mengapa meraih kunci IS? Apa yang kulewatkan di sini? Saya telah mencari jawaban di internet, tetapi sejauh ini belum ada jawaban.
Saya sudah menguji ini pada 2008R2 dan 2012.
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)
untuk efek nolock ganda;)