Я считаю, что практически никогда не правильно использовать nolock.
Если вы читаете одну строку, то правильный индекс означает, что вам не понадобится NOLOCK, так как отдельные действия строки выполняются быстро.
Если вы читаете много строк для чего-либо, кроме временного отображения, и хотите, чтобы вы могли повторить результат или защитить от полученного числа, то NOLOCK не подходит.
NOLOCK - это суррогатный тег для "мне все равно, содержит ли этот ответ повторяющиеся строки, строки, которые были удалены, или строки, которые никогда не вставлялись для начала из-за отката"
Ошибки, которые возможны при NOLOCK:
- Соответствующие строки не возвращаются вообще.
- отдельные строки возвращаются несколько раз (включая несколько экземпляров одного и того же первичного ключа)
- Строки, которые не совпадают, возвращаются.
Любое действие, которое может вызвать разделение страницы во время выполнения выбора noLock, может привести к тому, что это произойдет. Почти любое действие (даже удаление) может вызвать разделение страницы.
Поэтому: если вы «знаете», что строка не изменится во время работы, не используйте nolock, так как индекс обеспечит эффективный поиск.
Если вы подозреваете, что строка может измениться во время выполнения запроса, и вам нужна точность, не используйте nolock.
Если вы рассматриваете NOLOCK из-за взаимных блокировок, проверьте структуру плана запросов на наличие неожиданных сканирований таблиц, отследите взаимные блокировки и выясните, почему они возникают. NOLOCK вокруг записей может означать, что ранее заблокированные запросы потенциально могут дать неправильный ответ.