Безопасно ли использовать опцию WITH (NOLOCK) в MS SQL для операторов выбора и вставки, если - PullRequest
1 голос
/ 13 ноября 2008

Безопасно ли использовать опцию WITH (NOLOCK) в MS SQL для операторов выбора и операторов вставки, если вы никогда не изменяете строку, а только вставляете или удаляете строки?

То есть вы никогда не ОБНОВЛЯЕТЕ ни одну из строк.

Ответы [ 5 ]

5 голосов
/ 13 ноября 2008

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

SELECT
     my_id,
     my_date
FROM
     My_Table
WHERE
     my_date >= '2008-01-01'

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

Если вы просто имитируете обновления через удаление / вставку, вы также можете получить «старую» версию данных.

1 голос
/ 13 ноября 2008

Не в общем. (т.е. ОБНОВЛЕНИЕ не единственная проблема с блокировкой)

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

Если вставки или удаления никогда не будут выбраны (например, считанные данные всегда являются вчерашними данными, тогда как сегодняшние данные, поступающие или манипулируемые, никогда не читаются), тогда да, это "безопасно".

0 голосов
/ 30 сентября 2010

Ну, «сейф» - это очень общий термин; все зависит от контекста вашего приложения и его использования. Но всегда есть шанс пропустить и дважды подсчитать ранее зафиксированные строки, когда используется подсказка NOLOCK.

В любом случае, прочитайте это: http://blogs.msdn.com/b/sqlcat/archive/2007/02/01/previously-committed-rows-might-be-missed-if-nolock-hint-is-used.aspx

0 голосов
/ 13 ноября 2008

Не уверен, как операторы SELECT могут конфликтовать, если вы ограничиваете себя INSERT и DELETE. INSERT проблематичен, потому что, возможно, во время вашего запроса были вставлены конфликтующие первичные ключи. И INSERT, и DELETEs подвергают вас условиям, изложенным в предложении WHERE, или JOIN и т. Д. Могут стать недействительными во время выполнения вашего оператора.

0 голосов
/ 13 ноября 2008

Если вы никогда не делаете ОБНОВЛЕНИЯ, тогда почему блокировка создает вам проблему в первую очередь?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...