create table test (
id int identity,
id_int int default 1
)
insert test default values
go 1000
begin transaction
update test
set id_int = id_int
where id = 1000
waitfor delay '00:00:10'
commit
Outra sessão sem esperar obtenha o resultado:
set transaction isolation level read committed
select * from test
where id =1000
id | id_int
---------------
1000 |1
Alguém poderia explicar por que obtenho o resultado imediatamente?
No entanto, quando uso o nível de isolamento de leitura repetível, devo esperar:
set transaction isolation level repeatable read
select * from test
where id =1000
É porque o SQL Server está fazendo uma atualização sem atualização, veja os bloqueios abaixo que ele está adquirindo em dois casos,
Caso 1 : (atualização sem atualização)
É inteligente o suficiente para permitir
IS
o bloqueio enquantoIX
estiver ativo no objeto.Caso 2 : (atualização real)
Ele espera que
IX
o bloqueio seja liberado antes deIS
ser concedido para evitar leitura suja.Caso 3 : (atualização sem atualização com isolamento serializável)
Se você quiser substituir explicitamente esse comportamento, poderá usar o
SERIALIZABLE
isolamento ao fazer a atualização sem atualização, que obterá umX
bloqueio que bloqueia todos os outros bloqueios nele.