Является ли NOLOCK значением по умолчанию для операторов SELECT в SQL Server 2005? - PullRequest
2 голосов

У меня установлен только SQL Server 2008R2, хотя мне нужно общаться с клиентами, имеющими 2005 год.

[1] говорит:

  • " NOLOCK

    Это не блокирует любой объект. Это значение по умолчанию для операций SELECT. Это не относится к операторам INSERT, UPDATE и DELETE "

[2], похоже, не упоминает об этом, но моя проверка в SSMS / SS 2008R2 показывает, что nolock не является подсказкой по умолчанию для SELECT.

Является ли WITH (NOLOCK) действительно значением по умолчанию в SQL Server 2005 SELECT?
Где это написано в BOL2005 / 2008?


Обновление:
В разделе «Где это написано» я ожидал увидеть ответы / комментарии / разъяснения (или, лучше, цитаты) по всем цитируемым из [1] частей:

  • «Это не блокирует любой объект»

    Устанавливает ли SELECT без NOLOCK какие-либо блокировки в SQL Server 2005 (с уровнем изоляции по умолчанию READ UNCOMMITTED)?
    ... в SQL Server 2008 (соответственно с READ COMMITTED)?

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

    Означает ли уровень изоляции READ UNCOMMITTED (который используется как синоним для подсказки NOLOCK) отсутствие какой-либо блокировки?

  • "Это не относится к операторам INSERT, UPDATE и DELETE"
    Вроде бы правильно?
    Это потому, что они (INSERT, UPDATE и DELETE) всегда блокируются, а SELECT - нет?
    и т. д.

[1]
http://blog.sqlauthority.com/2007/04/27/sql-server-2005-locking-hints-and-examples/
[2] * * тысяча пятьдесят-один Электронная документация по SQL Server 2005. Подсказка к таблице (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms187373(SQL.90).aspx

Ответы [ 3 ]

11 голосов
/ 07 октября 2010

См. дубликат

NOLOCK не по умолчанию и не может быть установлен как таковой.Ссылка SQL Authority явно неверна.

2 голосов
/ 07 октября 2010

Насколько мне известно, NOLOCK не используется по умолчанию для операторов SELECT. Вам нужно конкретно указать, хотите ли вы использовать NOLOCK с SELECT.

0 голосов
/ 07 октября 2010

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

...