С (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 году, и это помогает мешать авторам блокировать читателей, предоставляя читателям снимок базы данных для использования. Я добавлю ссылку и оставлю читателю дальнейшие исследования:
Поскольку вы должны использовать WITH (NOLOCK) для каждой таблицы, может быть неудобно писать ее в каждом предложении FROM или JOIN. Однако у этого есть причина, почему это называют "грязным" чтением. Таким образом, вы действительно должны знать, когда вы делаете один, а не устанавливать его по умолчанию для области сеанса. Зачем?
Забывание WITH (NOLOCK) может не сильно повлиять на вашу программу, однако выполнение грязного чтения там, где вы не хотите, может иметь значение в определенных обстоятельствах.
Поэтому используйте WITH (NOLOCK), если текущие выбранные данные могут быть неверными, так как они могут быть откатаны позже. Это в основном используется, когда вы хотите повысить производительность, а требования к контексту вашего приложения позволяют ему рисковать отображением противоречивых данных. Однако вы или кто-либо из ответственных лиц должны взвесить все за и против решения об использовании WITH (NOLOCK).