Я досліджував деяке блокування, коли побачив запит, який виглядав приблизно так:
SELECT SomeField FROM SomeTable NOLOCK
Я побачив NOLOCK
і мені було цікаво, як це може блокувати інші запити, в цьому випадку DELETE
заяви. Я швидко ознайомився з використанням замків, sp_lock
і ось що я побачив:
DB S GRANT
TAB IS GRANT
PAG S GRANT
Тепер я розумію, що NOLOCK
передбачається лише зафіксувати схему стабільності схеми, чому тоді він схопив замок IS?
Моя цікавість була пікантною. Я заглянув у BOL і побачив, що існує два способи його використання, WITH (NOLOCK)
і застарілий (NOLOCK)
, тому вирішив спробувати їх. Я запустив такі запити, за якими виконувався запуск 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
Звичайно, є мої замки-стабільність. Тож моє запитання таке: що тут відбувається? Якщо прийнятий синтаксис використання NOLOCK є або, WITH (NOLOCK)
або (NOLOCK)
чому, помилка запиту не вимикається , коли він працює з простою NOLOCK
(без дужок)? Якщо він підтримується, чому захоплює блокування IS? Що я тут пропускаю? Я шукав відповідь в Інтернеті, але поки що з'явився короткий.
Я перевірив це як у 2008R2, так і у 2012 році.
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)
для подвійного ефекту блокування;)