2014-01-14 4 views
4

Я знаю with(nolock) и (nolock) такие же или почти одинаковые.REF:with(nolock) or (nolock) - Is there a difference?с (nolock), (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 хорошо или плохо здесь :)

+0

См [Таблица подсказки] (http://technet.microsoft.com/en-us/library/ms187373.aspx) на MSDN - поведение документировано. –

+0

Возможный дубликат [с (nolock) или (nolock) - есть разница?] (Http://stackoverflow.com/questions/12112855/withnolock-or-nolock-is-there-a-difference) –

+0

@Bharaththeorare , ты прочитал мой вопрос? И ответ ниже? – Bolu

ответ

10

Разница заключается в том, что вы должны использовать синтаксис WITH (NOLOCK) (или WITH (<any table hint>)). Зачем?

  1. Без WITH устарел. От Table Hints on 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, Level 15, State 1, Line 12
    Неправильный синтаксис около 'NOLOCK'. Если это предназначено как часть подсказки таблицы, теперь требуется ключевое слово A WITH и скобки. См. SQL Server Books Online для правильного синтаксиса.

Вы должны также рассмотреть возможность использования намека на уровень сеанса, SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED, потому что тогда вы не имеете проблем синтаксиса выше, и вы также не имеете 15 WITH (NOLOCK) сек засорения запроса. Это затрудняет замену с другим уровнем изоляции позже (например, RCSI, который гораздо более практичен, чем READ UNCOMMITTED IMHO), в то время как одноуровневое заявление на уровне партии - это очень простой однострочный файл для замены.

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

+0

так очевидно ...... Спасибо! – Bolu

+0

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

Смежные вопросы