2010-10-04 2 views
11

Я понимаю, что когда NOLOCK используется в инструкции SELECT, он также может читать незафиксированные/грязные строки. Но я хотел использовать подсказку NOLOCK на столе, чтобы мой запрос SELECT выполнялся быстро.SELECT Statement - NOLOCK с SET TRANSACTION УРОВЕНЬ ИЗОЛЯЦИИ READ COMMITTED

Теперь, NOLOCK на столе, но вместе с «УСТАНОВИТЬ УРОВЕНЬ ИЗОЛЯЦИИ УСТАНОВКИ ПЕРЕДАЧИ ПРОСМОТРЕТЬ» дает мне преимущество NOLOCK и более быстрый запрос SELECT (из-за NOLOCK) только с фиксированными строками (из-за SET)?

ответ

17

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

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

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

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



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

убедитесь, что не совершали Tran !! открыть еще одно окно и запустить этот

SET TRANSACTION ISOLATION LEVEL READ COMMITTED 

select * from bla -- with (nolock) 

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

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

SET TRANSACTION ISOLATION LEVEL READ COMMITTED 

select * from bla with (nolock) 

, как вы можете видеть, вы получите обратно строку

BTW, ПРОЧТИТЕ COMMITTED является уровень изоляции по умолчанию, нет необходимости устанавливать его

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