С (NOLOCK) против УСТАНОВЛЕННОГО УРОВНЯ ИЗОЛЯЦИИ СДЕЛКИ ПРОЧИТАЕТСЯ

Может ли кто-нибудь дать мне несколько советов о том, когда я должен использовать WITH (NOLOCK) в отличие от SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Каковы плюсы / минусы каждого? Есть ли какие-то непредвиденные последствия, с которыми вы столкнулись при использовании одного в отличие от другого?

6 ответов

Решение

Это одно и то же. Если вы используете set transaction isolation level оператора, он будет применяться ко всем таблицам в соединении, поэтому, если вы хотите только nolock на одной или двух таблицах используйте это; в противном случае используйте другой.

Оба дадут вам грязное чтение. Если вы в порядке с этим, то используйте их. Если у вас не может быть грязного чтения, тогда подумайте snapshot или же serializable намеки вместо.

WITH (NOLOCK) - это подсказка на уровне таблицы. Установка уровня изоляции транзакции READ_UNCOMMITTED влияет на соединение. Разница в масштабах. Смотрите READUNCOMMITTED и NOLOCK в документации по SQL Server здесь:

http://technet.microsoft.com/en-us/library/ms187373.aspx

Для УРОВНЯ ИЗОЛЯЦИИ СДЕЛКИ: http://technet.microsoft.com/en-us/library/ms173763.aspx

  • NOLOCK является локальным для таблицы (или представлений и т. Д.)
  • READ UNCOMMITTED для сеанса / подключения

Что касается руководящих принципов... случайный поиск из Stackru и электрических сетей...

Вы не можете использовать Задать уровень изоляции транзакции Чтение незафиксированным в представлении (на самом деле там может быть только один сценарий), поэтому вам придется использовать (nolock), если следует включить грязные строки.

Насколько мне известно, единственная разница заключается в масштабах эффектов, как сказал Стромми. НОЛОК намекает на стол и ЧИТАЕТ, НЕКОММИТИРОВАННЫЙ на сеансе.

Что касается проблем, которые могут возникнуть, это все о последовательности. Если вам не безразлично, знайте, что вы можете получить то, что называется "грязным чтением", которое может повлиять на другие данные, которые обрабатываются с неверной информацией.

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

Также я считаю, что в эти дни вы должны смотреть на Multi-version Concurrency Control. Я полагаю, что они добавили его в 2005 году, и это помогает мешать авторам блокировать читателей, предоставляя читателям снимок базы данных для использования. Я добавлю ссылку и оставлю читателю дальнейшие исследования:

MVCC

Уровни изоляции базы данных

Поскольку вы должны использовать WITH (NOLOCK) для каждой таблицы, может быть неудобно писать ее в каждом предложении FROM или JOIN. Однако у этого есть причина, почему это называют "грязным" чтением. Таким образом, вы действительно должны знать, когда вы делаете один, а не устанавливать его по умолчанию для области сеанса. Зачем?

Забывание WITH (NOLOCK) может не сильно повлиять на вашу программу, однако выполнение грязного чтения там, где вы не хотите, может иметь значение в определенных обстоятельствах.

Поэтому используйте WITH (NOLOCK), если текущие выбранные данные могут быть неверными, так как они могут быть откатаны позже. Это в основном используется, когда вы хотите повысить производительность, а требования к контексту вашего приложения позволяют ему рисковать отображением противоречивых данных. Однако вы или кто-либо из ответственных лиц должны взвесить все за и против решения об использовании WITH (NOLOCK).

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