С НАКОПЛЕНИЕМ (NOLOCK) и НАСТРОЙКА СТАВКИ

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 4

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

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

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

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

MVCC

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

Ответ 5

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

Ответ 6

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

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

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