ВЫБОР ЗАЯВКИ - NOLOCK с SET TRANSACTION УРОВЕНЬ ИЗОЛЯЦИИ ПРОСИТ КОМИТЕТ

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

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

Ответ 1

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

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

сначала запустите этот

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)

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

BTW, READ COMMITTED - это уровень изоляции по умолчанию, нет необходимости устанавливать его

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