Понимание подсказки 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
в начале сеанса.