(NOLOCK) vs NOLOCK

24

Saya sedang menyelidiki beberapa pemblokiran ketika saya melihat permintaan yang terlihat seperti ini:

SELECT SomeField FROM SomeTable NOLOCK

Saya melihat NOLOCKdan ingin tahu bagaimana bisa memblokir pertanyaan lain, dalam DELETEpernyataan kasus ini . Saya melihat sekilas kunci menggunakan sp_lockdan di sini adalah apa yang saya lihat:

DB      S   GRANT

TAB     IS  GRANT

PAG    S    GRANT

Sekarang, pemahaman saya adalah bahwa NOLOCKseharusnya 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.

Brian
sumber
4
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)untuk efek nolock ganda;)
ypercubeᵀᴹ

Jawaban:

52
SELECT SomeField
FROM   SomeTable NOLOCK 

berarti Anda baru saja alias SomeTable AS NOLOCK. Coba di bawah ini untuk melihat ini dengan jelas:

SELECT NOLOCK.SomeField
FROM   SomeTable NOLOCK 

Ini jelas tidak berpengaruh pada perilaku penguncian kueri. Kueri tidak gagal karena meskipun kata kunci & berwarna biru di SSMS, NOLOCK bukan kata yang dilindungi undang - undang di Transact-SQL dan karenanya tidak menyebabkan kesalahan sintaksis. Daftar kata-kata yang dicadangkan: https://msdn.microsoft.com/en-us/library/ms189822.aspx

Sintaks yang benar untuk digunakan sebagai petunjuk:

  • (NOLOCK) valid tetapi sudah usang.
  • WITH (NOLOCK) adalah sintaks yang disarankan.
Gareth Lyons
sumber
14
Wow, tidak yakin bagaimana saya tidak mengetahuinya. Itu benar-benar membuatku gila, sekarang aku hanya merasa malu :) Kadang-kadang hal yang paling sederhana, kurasa.
Brian
2
@ Brian Jangan khawatir, saya harus men-debug sesuatu yang sangat mirip baru-baru ini, kalau tidak, mungkin tidak begitu mudah dikenali! Anda dapat melihat mengapa MS tidak lagi menggunakan sintaks itu.
Gareth Lyons
Apakah NOLOCK bukan kata kunci yang dipesan? Bukankah seharusnya mengeluh jika Anda tidak menggunakan [NOLOCK]?
Aaroninus
6
Tidak msdn.microsoft.com/en-us/library/ms189822.aspx Meskipun itu muncul dengan warna biru di SSMS yang dapat membuat Anda pergi.
Gareth Lyons
Tangkapan yang bagus, LOL. Tanya Jawab favorit saya hari ini.
RBarryYoung