2009-11-05 1 views
11

Получаю, что подсказка оптимизатора (nolock) позволяет «грязные чтения», но по каким очень конкретным сценариям это плохая идея? Я никогда не видел такого широкого использования (nolock) в организации, и это заставляет меня нервничать. Мне хотелось бы объяснить объяснения пользователей. «Павел делает A, Питер делает B, X происходит вместо Y».Что может произойти в результате использования (nolock) для каждого SELECT в SQL Server?

ответ

13

перепроведение this ответа:


NOLOCK означает не став замков на всех.

Ваш может запрос возвращает порцию данных, как раньше UPDATE и порций по состоянию после UPDATEв одном запросе.

Как дебет без кредита и таких вещей.

Например, я побежал этот запрос на большом столе:

SELECT SUM(LEN(name)) 
FROM master WITH (NOLOCK) 
OPTION (MAXDOP 1) 

--- 
18874367 

Все name «s имеют длину 1.

Тогда я перезапустил его и в середине запроса обновленной таблицы:

UPDATE master 
SET  name = 'tt' 
WHERE id <= 10000 

SELECT SUM(LEN(name)) 
FROM master WITH (NOLOCK) 
OPTION (MAXDOP 1) 

--- 
18874944 

Как мы можем видеть, этот запрос заметил 577 строк в обновленной (длина 2), все остальные строки не обновляется (длина 1).

SELECT SUM(LEN(name)) 
FROM master WITH (NOLOCK) 
OPTION (MAXDOP 1) 

--- 
18884367 

И этот запрос запускается сразу после завершения предыдущего, видит все обновления.

+1

Не переписывает ли ответ на вопрос как дубликат? – AnthonyWJones

+8

Нет. '42' - хороший ответ для многих вопросов :) – Quassnoi

+2

Вы также можете упомянуть, что такое поведение не уникально для' READ UNCOMMITTED' - это может произойти и при 'READ COMMITTED' и' REPEATABLE READ'. Это гораздо более вероятно на самом низком уровне изоляции. –

-1

Недавно я потратил много времени на то, чтобы выяснить время и проблемы блокировки для процесса сборки хранилища данных. Как оказалось, из-за только для чтения данных для загрузки хранилища я добавил подсказки nolock к запросам исходных данных для etl, чтобы уменьшить потребность в эскалации блокировки на сервере sql и сохранить потерю etl от отказа , Для этого я очень мало контролировал сервер sql и приложение. Опять же, это было целевое решение, и я не рекомендую широко использовать любые подсказки в качестве общего правила. Как и все тесты производительности и обзор, есть ключевые области, на которые нужно обратить внимание, чтобы определить, где лежит проблема, и что может быть лучшим способом атаковать ее.

+0

Если источник данных был доступен только для чтения, почему это важно, если разделяемая блокировка чтения был помещен на него? Может, я неправильно понял, что вы написали? –

+0

Это не ответ на мой вопрос, это пропаганда для NOLOCK как стратегии. Напротив того, что я ищу. -1. –

Смежные вопросы