С (NOLOCK) vs УСТАНОВИТЬ УРОВЕНЬ ИЗОЛЯЦИИ СЧИТЫВАНИЯ ЧИТАТЬ БЕЗ КОММИТИТОРЫ

Может ли кто-нибудь дать мне несколько советов о том, когда мне следует использовать С (NOLOCK) , а не УСТАНОВИТЬ УРОВЕНЬ ИЗОЛЯЦИИ СДЕЛКИ СЧИТАЕТСЯ НЕЗАКОННЫМ

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

114
задан Ed Harper 18 July 2014 в 09:22
поделиться

5 ответов

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

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

101
ответ дан 24 November 2019 в 02:36
поделиться

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

25
ответ дан 24 November 2019 в 02:36
поделиться

Насколько мне известно, единственная разница - это масштаб эффектов, как сказал Стромми. Подсказка NOLOCK для таблицы и READ UNCOMMITTED на сеансе.

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

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

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

MVCC

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

9
ответ дан 24 November 2019 в 02:36
поделиться

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

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

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

4
ответ дан 24 November 2019 в 02:36
поделиться
  • NOLOCK является локальным для таблицы (или представлений и т. Д.)
  • READ UNCOMMITTED относится к сеансу / соединению

Что касается рекомендаций ... случайный поиск из StackOverflow и электрического интернета. ..

10
ответ дан 24 November 2019 в 02:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: