Я понимаю, что подсказка оптимизатора (nolock)
позволяет "грязные чтения", но по каким очень конкретным сценариям это плохая идея? Я никогда не видел такого широко распространенного использования (nolock)
в организации, и это заставляет меня нервничать. Мне хотелось бы объяснить объяснения пользователей. "Павел делает A, Питер делает B, X происходит вместо Y".
Что может произойти в результате использования (nolock) для каждого SELECT в SQL Server?
Ответ 1
Отмена этого:
NOLOCK
означает отсутствие блокировок вообще.
В запросе могут возвращаться части данных до UPDATE
и части после UPDATE
в одном запросе.
Как, дебет без кредита и таких вещей.
Например, я просто запустил этот запрос в большой таблице:
SELECT SUM(LEN(name))
FROM master WITH (NOLOCK)
OPTION (MAXDOP 1)
---
18874367
Все name
имеют длину 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
И этот запрос запускается сразу после предыдущего, видит все обновления.
Ответ 2
См. эту ссылку для примеров.
http://blogs.msdn.com/davidlean/archive/2009/04/06/sql-server-nolock-hint-other-poor-ideas.aspx
Ответ 3
Недавно я потратил много времени на то, чтобы выяснить время и проблемы с блокировкой для процесса сборки хранилища данных. Как оказалось, из-за только для чтения данных для загрузки хранилища я добавил подсказки nolock к запросам исходных данных для etl, чтобы уменьшить потребность в эскалации блокировки на сервере sql и сохранить потерю etl от отказа, Для этого я очень мало контролировал сервер sql и приложение. Опять же, это было целевое решение, и я не рекомендую широко использовать любые подсказки в качестве общего правила. Как и все тесты производительности и обзор, есть ключевые области, на которые нужно обратить внимание, чтобы определить, где находится проблема, и что может быть лучшим способом атаковать ее.