С (нолоком), (нолоком), нолоком различий?

я знаю 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>)). Зачем?

  1. Без WITH устарела. Из таблицы подсказок на MSDN:

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

  2. from table1 nolock вообще не намекает - это псевдоним. Например:

    SELECT nolock.name FROM sys.objects nolock ORDER BY nolock.name;
    

    Обратите внимание, что я могу использовать nolock как псевдоним. Здесь нет подсказок.

  3. 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 ] )

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

Другие вопросы по тегам