Подтвердить что ты не робот

Синтаксис для nolock в sql

Я видел заявления sql с помощью nolock и с (nolock) например,

select * from table1 nolock where column1 > 10

и

select * from table1 with(nolock) where column1 > 10

Какое из приведенных выше утверждений верно и почему?

4b9b3361

Ответ 1

Первое утверждение ничего не блокирует, а второе. Когда я тестировал это сейчас только на SQL Server 2005,

select * from table1 nolock where column1 > 10

"nolock" стал псевдонимом внутри этого запроса таблицы1.

select * from table1 with(nolock) where column1 > 10

выполняет желаемую функциональность nolock. Скептически? В отдельном окне запустите

BEGIN TRANSACTION
UPDATE tabl1
 set SomeColumn = 'x' + SomeColumn

чтобы заблокировать таблицу, а затем попробуйте каждый оператор блокировки в своем собственном окне. Первый будет зависать, ожидая освобождения блокировки, а второй будет работать сразу (и покажет "грязные данные" ). Не забудьте выпустить

ROLLBACK

когда вы закончите.

Ответ 2

Список устаревших функций находится в Функции устаревших компонентов базы данных в SQL Server 2008:

  • Указание NOLOCK или READUNCOMMITTED в предложении FROM UPDATE или DELETE.
  • Задание таблицы подсказки без использования ключевого слова WITH.
  • HOLDLOCK табличный подсказку без скобка
  • Использование пробела в качестве разделителя между табличными подсказками.
  • Косвенное применение табличных подсказок к вызову функции отображения с несколькими операторами (TVF) через представление.

Все они входят в список функций, которые будут удаляться иногда после следующей версии SQL, то есть они, скорее всего, будут поддерживаться в выпуске enxt только при более низком уровне совместимости с базой данных.

Как говорится, мои 2c в этом вопросе таковы:

  • Оба from table nolock и from table with(nolock) ошибочны. Если вам нужны грязные чтения, вы должны использовать соответствующие уровни изоляции транзакций: set transaction isolation level read uncommitted. Таким образом, используемый уровень искры четко излагается и контролируется с помощью одной "ручки", а не распространяется на источник и зависит от всех причуд табличных подсказок (косвенное применение через представления и ТВФ и т.д.).
  • Грязные чтения - это оговорка. Что нужно, в 99,99% случаев, это сокращение конкуренции, а не чтение незафиксированных данных. Конфликт уменьшается путем написания правильных запросов по хорошо продуманной схеме и, при необходимости, путем развертывания изоляции моментальных снимков. Лучшее решение, которое решает работу, почти всегда сохраняет несколько крайних случаев, заключается в включить чтение прочитанного моментального снимка в базе данных и позволить движку работать своей магией:

    ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
    ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON

Затем удалите ВСЕ подсказки из выбранных.

Ответ 4

Используйте "WITH (NOLOCK)".

Ответ 5

Оба являются синтаксически правильными.

NOLOCK станет псевдонимом для таблицы1.

WITH (NOLOCK) часто используется как волшебный способ ускорить чтение базы данных, но я стараюсь избегать его использования.

Результирующий набор может содержать строки, которые еще не были зафиксированы, которые часто позже откатываются.

Ошибка или набор результатов могут быть пустыми, пропускать строки или отображать одну и ту же строку несколько раз.

Это связано с тем, что другие транзакции перемещают данные одновременно с чтением.

READ COMMITTED добавляет дополнительную проблему, когда данные повреждаются в одном столбце, где несколько пользователей одновременно меняют одну и ту же ячейку.

Есть и другие побочные эффекты, которые приводят к жертве увеличения скорости, которое вы надеялись получить в первую очередь.

Теперь вы знаете, никогда не используйте его снова.