(NOLOCK) - NOLOCK


24

Я досліджував деяке блокування, коли побачив запит, який виглядав приблизно так:

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 році.


4
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)для подвійного ефекту блокування;)
ypercubeᵀᴹ

Відповіді:


52
SELECT SomeField
FROM   SomeTable NOLOCK 

означає, що ви просто призвані SomeTable AS NOLOCK. Спробуйте нижче, щоб зрозуміти це:

SELECT NOLOCK.SomeField
FROM   SomeTable NOLOCK 

Це, очевидно, не впливає на блокуючу поведінку запиту. Запит не виходить з ладу, тому що, незважаючи на те, що ключове слово та показ синього кольору у SSMS, NOLOCK не є зарезервованим словом у Transact-SQL і тому не викликає синтаксичної помилки. Список зарезервованих слів: https://msdn.microsoft.com/en-us/library/ms189822.aspx

Правильний синтаксис для використання в якості підказки:

  • (NOLOCK) дійсна, але застаріла.
  • WITH (NOLOCK) є рекомендованим синтаксисом.

14
Нічого собі, не впевнений, як я цього не зрозумів. Це насправді зводило мене з розуму, тепер я просто збентежений :) Це, мабуть, найпростіші речі.
Брайан

2
@Brian Не хвилюйтесь, нещодавно мені довелося налагоджувати щось дуже схоже, інакше це було не так просто! Ви можете зрозуміти, чому MS знецінила цей синтаксис.
Гарет Ліон

Чи NOLOCK не є зарезервованим ключовим словом? Чи не слід скаржитися, якщо ви не використовуєте [NOLOCK]?
Ааронін

6
Nope msdn.microsoft.com/en-us/library/ms189822.aspx Хоча він відображається синім кольором у SSMS, що може вас скинути.
Гарет Ліон

Гарний улов, LOL. Мій улюблений Q / A сьогодні.
RBarryYoung
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.