Что такое «с (nolock)» в SQL Server?

Может ли кто-нибудь объяснить последствия использования with (nolock) по запросам, когда вы должны / не должны его использовать?

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

16 Solutions collect form web for “Что такое «с (nolock)» в SQL Server?”

WITH (NOLOCK) является эквивалентом использования READ UNCOMMITED в качестве уровня изоляции транзакции. Таким образом, вы рискуете прочитать незафиксированную строку, которая впоследствии откат, то есть данные, которые никогда не попадали в базу данных. Таким образом, хотя это может помешать чтению заходить в тупик другими операциями, это сопряжено с риском. В банковском приложении с высокими ставками транзакций это, вероятно, не будет правильным решением любой проблемы, которую вы пытаетесь решить с помощью ИМХО.

Вопрос в том, что хуже:

  • тупик или
  • неправильное значение?

Для финансовых баз данных взаимоблокировки намного хуже неправильных значений. Я знаю, что это звучит в обратном направлении, но выслушайте меня. Традиционным примером транзакций БД является обновление двух строк, вычитание из одного и добавление в другое. Это не правильно.

В финансовой базе данных вы используете деловые операции. Это означает добавление одной строки в каждую учетную запись. Крайне важно, чтобы эти транзакции завершились, и строки успешно записаны.

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

Тем не менее, SQL Server 2005 исправил большинство ошибок, которые сделали NOLOCK необходимым. Поэтому, если вы не используете SQL Server 2000 или ранее, вам не нужно.

Дальнейшее чтение
Версии уровня строк

Пример текстовой книги для законного использования подсказки nolock – это выборка отчета для базы данных OLTP с высоким уровнем обновления.

Принять актуальный пример. Если бы крупный банк США на высоких улицах захотел запустить почасовой отчет о поиске первых признаков городского уровня, которые выполнялись в банке, запрос на нолоке мог бы сканировать транзакционные таблицы, суммирующие денежные депозиты и снятие наличных денег в каждом городе. Для такого отчета крошечный процент ошибок, вызванных свернутыми транзакциями обновления, не снизит значение отчета.

К сожалению, речь идет не только о чтении несанкционированных данных. В фоновом режиме вы можете в два раза увеличить число страниц (в случае разделения страниц), или вы можете вообще пропустить страницы. Таким образом, ваши результаты могут быть сильно искажены.

Посмотрите статью Ицика Бен-Гана . Вот выдержка:

«С подсказкой NOLOCK (или установкой уровня изоляции сеанса READ UNCOMMITTED) вы указываете SQL Server, что вы не ожидаете согласованности, поэтому нет никаких гарантий. Помните, что« непоследовательные данные »означают не только то, что вы можете увидеть незафиксированные изменения, которые впоследствии были отброшены, или изменения данных в промежуточном состоянии транзакции. Это также означает, что в простом запросе, который сканирует все данные таблицы / индекса, SQL Server может потерять позицию сканирования, или вы можете получив одну и ту же строку дважды ».

Не знаете, почему вы не заключаете финансовые транзакции в транзакциях с базой данных (например, когда вы переводите средства с одной учетной записи на другую – вы не совершаете одну сторону транзакции одновременно), поэтому существуют явные транзакции. Даже если ваш код работает с бизнес-транзакциями, поскольку это похоже на то, что все транзакционные базы данных могут делать неявные откаты в случае ошибок или сбоев. Я думаю, что эта дискуссия проходит над вашей головой.

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

Никакая блокировка не только возвращает неправильные значения, она возвращает фантомные записи и дубликаты.

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

Справедливости ради, вот два специальных сценария, где подсказка nolock может обеспечить полезность

1) База данных sql-сервера до 2005 года, которая должна запускать длительный запрос в отношении текущей базы данных OLTP, может быть единственным способом

2) Плохо написанное приложение, которое блокирует записи и возвращает управление пользовательскому интерфейсу и читателям, блокируется неограниченно. Nolock может быть полезен здесь, если приложение не может быть исправлено (сторонний и т. Д.), А firebase database – либо до 2005 года, либо версия версии не может быть включена.

NOLOCK эквивалентен READ UNCOMMITTED , однако Microsoft заявляет, что вы не должны использовать его для операторов UPDATE или DELETE :

Для операторов UPDATE или DELETE: эта функция будет удалена в будущей версии Microsoft SQL Server. Избегайте использования этой функции в новых разработках и планируйте изменять приложения, которые в настоящее время используют эту функцию.

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

Эта статья относится к SQL Server 2005, поэтому поддержка NOLOCK существует, если вы используете эту версию. В целях обеспечения будущего кода (при условии, что вы решили использовать грязные чтения), вы можете использовать это в своих хранимых процедурах:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Другой случай, когда обычно это нормально, – это firebase database отчетов, где данные, возможно, уже поставлены, а записи просто не происходят. В этом случае, однако, параметр должен быть установлен на уровне базы данных или таблицы администратором, изменив уровень изоляции по умолчанию.

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

Я также предположу, что это, вероятно, не очень хорошая идея в банковском приложении. Или приложение инвентаризации. Или где бы вы ни думали о транзакциях.

Вы можете использовать его, когда вы только читаете данные, и вам действительно неинтересно, сможете ли вы вернуть данные, которые еще не зафиксированы.

Это может быть быстрее при операции чтения, но я не могу сказать, насколько.

В общем, я рекомендую не использовать его – чтение несовместимых данных может быть немного запутанным в лучшем случае.

Простой ответ – всякий раз, когда ваш SQL не изменяет данные, и у вас есть запрос, который может мешать другим действиям (через блокировку).

Это стоит учитывать для любых запросов, используемых для отчетов, особенно если запрос занимает больше, чем, скажем, 1 секунду.

Это особенно полезно, если у вас есть отчеты типа OLAP, которые вы используете против базы данных OLTP.

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

Мои 2 цента – имеет смысл использовать WITH (NOLOCK ), когда вам нужно создавать отчеты. На данный момент данные не будут сильно меняться, и вы не захотите блокировать эти записи.

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

Для финансовых записей (и почти всех других записей в большинстве приложений) nolock наносит ущерб, поскольку вы могли бы читать данные с записи, которая была написана, и не получать правильные данные.

Я использовал для получения «следующей партии» для вещей. В этом случае не имеет значения точный элемент, и у меня есть много пользователей, которые запускают этот же запрос.

Используйте nolock, когда вы будете в порядке с «грязными» данными. Это означает, что nolock также может считывать данные, которые находятся в процессе изменения и / или незафиксированных данных.

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

Я использую подсказку (nolock), особенно в базах данных SQLServer 2000 с высокой активностью. Я не уверен, что это необходимо в SQL Server 2005. Недавно я добавил этот намек на SQL Server 2000 по просьбе клиента DBA, потому что он замечал множество блокировок записей SPID.

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

Кстати, базы данных, к которым я имею дело, являются справочными системами корпоративных медицинских заявок, поэтому мы говорим о миллионах записей и 20 + таблицах во многих объединениях. Обычно я добавляю подсказку WITH (nolock) для каждой таблицы в соединении (если это не производная таблица, и в этом случае вы не можете использовать этот конкретный намек)

Короткий ответ:

Никогда не используйте WITH (NOLOCK) .

Длительный ответ:

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

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

Ошибка или Result-set могут быть пустыми, пропускать строки или отображать одну и ту же строку несколько раз.

Это связано с тем, что другие транзакции перемещают данные одновременно с чтением.

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

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

Можно утверждать, что хорошо использовать его в тех местах, где вы можете с ним справиться, но в чем смысл? Я не могу думать о ситуации, когда поврежденные данные приемлемы.

Никогда не используйте NOLOCK.

(Когда-либо)

Самый простой ответ – простой вопрос – нужны ли вам результаты, которые можно было бы повторить? Если да, то NOLOCKS не подходит ни при каких обстоятельствах

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

  • Импорт таблиц электронной таблицы Excel в базу данных SQL Server
  • Журнал ошибок служб компонентов - SQL Server Distributed Replay Client
  • Как конкатенировать текст из нескольких строк в одну текстовую строку на SQL-сервере?
  • Найти все таблицы, содержащие столбец с указанным именем - MS SQL Server
  • Как подключиться к базе данных Unity
  • Как проверить, существует ли столбец в таблице SQL Server?
  • PHP Неустранимая ошибка: вызов неопределенной функции mssql_connect ()
  • Инструкция INSERT противоречит ограничению FOREIGN KEY - SQL Server
  • Экспорт данных SQL-запроса в Excel
  • Interesting Posts

    Windows 10 ShellExperienceHost сбой

    Вращение элемента анимации

    Является ли шифрование электронной почты достаточно практичным?

    Не удается загрузить изображения с веб-сайта, если изображения используют HTTPS, но веб-сайт использует HTTP?

    Как определить фоновую программу (в Windows 7), которая автоматически крадет активную фокус?

    Просмотр списка символических ссылок в системе?

    Условное форматирование ячейки на основе значения в 4 смежных ячейках

    Использование «head» или «tail» в HUGE текстовом файле – 19 ГБ

    Как я могу получить точное время, например, в миллисекундах в Objective-C?

    Инструмент для автоматического создания и компоновки диаграммы отношений сущностей?

    Как проверить все файлы zip в папке, чтобы проверить, повреждены ли они или нет?

    Используйте Google вместо Bing с поиском в Windows 10

    Как удалить элемент из массива в C #

    Какой инструмент может дать мне почасовое напоминание?

    Использование нескольких открытых ключей SSH

    Давайте будем гением компьютера.