Оператор SELECT - NOLOCK с заданным уровнем изоляции транзакции READ совершен - PullRequest
11 голосов
/ 04 октября 2010

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

Теперь, NOLOCK для таблицы, но вместе с "SET TRANSACTION ISOLATION LEVEL READ COMMITTED" дают мне преимущество NOLOCK и более быстрый запрос SELECT (из-за NOLOCK) только с зафиксированными строками (из-за SET)?

1 Ответ

17 голосов
/ 04 октября 2010

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

легко проверить

первый запуск этого

create table bla(id int)
insert bla values(1)



begin tran
select * from bla with (updlock, holdlock)

убедитесь, что не совершаете транс !! откройте другое окно и запустите

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

select * from bla -- with (nolock)

вы ничего не получите обратно.

откройте другое окно и запустите это сейчас

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

select * from bla with (nolock)

как видите, вы вернетесь назад

Кстати, READ COMMITTED - уровень изоляции по умолчанию, его не нужно устанавливать

Взгляните на Изоляция снимков , которая не вернет вам грязные данные, но все равно не заблокирует

...