Я досліджував деяке блокування, коли побачив запит, який виглядав приблизно так:
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)для подвійного ефекту блокування;)