С (нолоком), (нолоком), нолоком различий?
я знаю with(nolock)
а также (nolock)
одинаковы или почти одинаковы. REF: с (nolock) или (nolock) - есть ли разница?
но как насчет nolock
? Вы можете использовать любой из них в select
и единственное заметное отличие, которое я вижу, это использование псевдонима, который вы можете написать:
select * from table1 as mytable with(nolock)
или же
select * from table1 as mytable (nolock)
но вы не можете написать:
select * from table1 as mytable nolock
PS: я не обсуждаю nolock
здесь хорошо или плохо:)
2 ответа
Разница в том, что вы должны использовать синтаксис WITH (NOLOCK)
(или же WITH (<any table hint>)
). Зачем?
Без
WITH
устарела. Из таблицы подсказок на MSDN:Пропуск ключевого слова WITH является устаревшей функцией: эта функция будет удалена в следующей версии Microsoft SQL Server. Избегайте использования этой функции в новых разработках и планируйте модифицировать приложения, которые в настоящее время используют эту функцию.
from table1 nolock
вообще не намекает - это псевдоним. Например:SELECT nolock.name FROM sys.objects nolock ORDER BY nolock.name;
Обратите внимание, что я могу использовать
nolock
как псевдоним. Здесь нет подсказок.from table1 as mytable nolock
неверный синтаксис в современных версиях SQL Server.Msg 1018, уровень 15, состояние 1, строка 12
Неверный синтаксис рядом с 'nolock'. Если это предназначено как часть табличной подсказки, теперь требуются ключевое слово WITH и скобки. См. SQL Server Books Online для правильного синтаксиса.
Вы должны также рассмотреть возможность использования подсказки на уровне сеанса, SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
потому что тогда у вас нет проблемы с синтаксисом выше, и у вас также нет 15 WITH (NOLOCK)
s замусорив ваш запрос. Это затрудняет замену на другой уровень изоляции позже (например, RCSI, который гораздо более практичен, чем READ UNCOMMITTED
ИМХО), тогда как одиночный оператор уровня пакета очень легко заменить на одну строку.
Кроме того, и это для других читателей больше, чем для ОП, пожалуйста, будьте абсолютно уверены, что вы понимаете риски использования NOLOCK
, которые включают получение поврежденных данных в одной строке, которая никогда не существовала:
Часть табличной подсказки запроса select имеет следующий синтаксис:
WITH ( <table_hint> [ [, ]...n ] )