Это не всегда плохо.
Конечно, это позволяет вам читать непереданные значения (которые могут быть откатаны и, следовательно, никогда не существовали логически), а также разрешать такие явления, как считывание значений несколько раз или не делать это вообще.
Единственные уровни изоляции, которые гарантируют, что вы не столкнетесь с такими аномалиями, - это сериализуемый / снимок. При повторяемом чтении значения могут быть пропущены, если строка перемещена (из-за обновления ключа) до того, как сканирование достигнет этой строки, при подтверждении прочитанного значения могут быть прочитаны дважды, если обновление ключа вызывает перемещение ранее прочитанной строки.
Эти проблемы, скорее всего, возникнут в nolock
связи с тем, что, по умолчанию, на этом уровне изоляции он будет использовать упорядоченное сканирование при выделении, когда он оценивает, что нужно прочитать более 64 страниц . Наряду с категорией проблем, возникающих при перемещении строк между страницами из-за обновлений индексного ключа, эти упорядоченные сканирования размещения также уязвимы для проблем с разбиением страниц (где строки могут быть пропущены, если вновь выделенная страница находится в файле раньше, чем точка уже отсканировано или прочитано дважды, если уже отсканированная страница разделена на более позднюю страницу в файле).
По крайней мере, для простых запросов (для одной таблицы) можно отказаться от использования этих проверок и получить упорядоченное сканирование по ключу nolock
, просто добавив ORDER BY index_key
к запросу так, чтобы Ordered
свойство IndexScan
is было true
.
Но если ваше приложение для составления отчетов не нуждается в абсолютно точных цифрах и может допустить большую вероятность таких несоответствий, это может быть приемлемым.
Но, конечно, вам не следует бросать это на все запросы в надежде, что это волшебная «турбо» кнопка. Помимо большей вероятности обнаружения аномальных результатов на этом уровне изоляции или вообще без результатов (ошибка «Не удалось продолжить сканирование с NOLOCK из-за перемещения данных»), существуют даже случаи, когда производительность с nolock
может быть намного хуже .