Понимание подсказки NOLOCK

Допустим, у меня есть таблица с 1000 000 строк и работает SELECT * FROM TableName на эту таблицу уходит около 10 секунд, чтобы вернуть данные.

Без оператора NOLOCK (устранение проблем, связанных с грязным чтением), этот запрос блокирует таблицу на 10 секунд, что означает, что никакой другой процесс не может читать или писать в таблицу?

Администраторы базы данных часто сообщают мне, что при запросе оперативных данных для диагностики проблем с данными мне следует использовать NOLOCK, чтобы не блокировать таблицу, которая может вызвать проблемы у пользователей. Это правда?

3 ответа

Решение

NOLOCK подсказка таблицы приведет к тому, что для рассматриваемой таблицы не будут приниматься общие блокировки; то же самое с READUNCOMMITTED уровень изоляции, но на этот раз относится не к одной таблице, а ко всему, что происходит. Итак, ответ "нет, он не заблокирует стол". Обратите внимание, что возможные блокировки схемы будут по-прежнему сохраняться даже при readuncommitted.

Не запрашивая разделяемых блокировок, операция чтения потенциально может считывать грязные данные (обновленные, но еще не зафиксированные) и несуществующие данные (обновленные, но откатанные), в любом случае несовместимые с транзакциями, и может даже пропустить целые страницы (в случай разбиения страницы происходит одновременно с операцией чтения).

Указание либо NOLOCK или же READUNCOMMITTED не считается хорошей практикой. Это будет быстрее, конечно. Просто убедитесь, что вы знаете о последствиях.

Кроме того, поддержка этих подсказок в инструкциях UPDATE и DELETE будет удалена в следующей версии, согласно документации.

Ваш запрос попытается получить блокировку на уровне таблицы, когда вы запрашиваете все данные. Так что да, он будет удерживаться на протяжении всего запроса и всех других процессов, пытающихся получить эксклюзивные блокировки для этой таблицы и помещать их в очереди ожидания. Процессы, которые также пытаются читать из этой таблицы, не будут заблокированы.

Любая диагностика, выполняемая в работающей системе, должна выполняться с осторожностью, а подсказка NOLOCK позволит вам просматривать данные, не создавая конкуренции для пользователей.

РЕДАКТИРОВАТЬ: Как указывалось, обновления обновления совместимы с общими блокировками. Так что не будет заблокирован процессом чтения.

Даже с NOLOCKТем не менее, SQL Server может переопределить и получить блокировку. Это называется QUERY **HINT** по причине. Надежный способ избежать замков - использовать SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED в начале сеанса.

Другие вопросы по тегам