NOLOCK против уровня изоляции транзакции
В чем разница между использованием "УСТАНОВИТЬ УРОВЕНЬ ИЗОЛЯЦИИ УСТАНОВКИ СЧИТАЕТСЯ НЕЗАКОННЫМ" и NOLOCK? Один лучше другого?
4 ответа
Это одно и то же, просто по-другому. NOLOCK размещается на основе таблицы и SET Transaction...
может быть размещен как блок.
NOLOCK является подсказкой запроса и как таковая применяется только к таблице Specc в запросе, в котором она указана.
Установка уровня изоляции транзакции применяется ко всему коду, выполняемому внутри текущего соединения или до тех пор, пока он не будет явно изменен.
Чтобы уточнить, функционально уровень изоляции на работе является тем же самым, однако охват, который охватывается, может не быть.
Посмотрите этот ответ несколько часов назад на вопрос, какие операторы SQL Server SELECT вызывают блокировку.
Цитирую Remus Rusanu:
SELECT может блокировать обновления. Правильно спроектированная модель данных и запрос вызовут только минимальную блокировку и не будут проблемой. "Обычная" подсказка WITH NOLOCK - почти всегда неправильный ответ. Правильный ответ - настроить ваш запрос, чтобы он не сканировал огромные таблицы.
Если запрос неуправляем, то сначала следует рассмотреть уровень ИЗОЛЯЦИИ SNAPSHOT, во-вторых, рассмотреть возможность использования SNAPSHOTS БАЗЫ ДАННЫХ, а последним параметром должен быть DIRTY READS (и лучше изменить уровень изоляции, чем использовать подсказку NOLOCK). Обратите внимание, что грязные чтения, как ясно указывает название, будут возвращать противоречивые данные (например, ваш общий лист может быть несбалансированным).
Другие ответы также могут вам помочь.
Они имеют тот же эффект, только один используется в качестве подсказки блокировки (nolock), а другой - для области соединения.
Будьте осторожны с любым из них - грязное чтение может быть очень плохой вещью в зависимости от вашего приложения. Чтение одной и той же записи дважды или пропущенная запись из-за перемещения страницы может быть очень запутанной вещью для пользователей...