Olhando para
update MyTable
set Status = 1
where Status = 0
claro, o where
é calculado antes da atualização real.
mas será que essa filtragem ( where Status = 0
) também fica dentro da fechadura ?
Quero dizer, onde está a fechadura?
aqui :update ...
ou aqui : filter and update...
Existem dois estágios para o bloqueio de dados atualizados. O primeiro é um bloqueio de atualização (U) e o segundo, desde que haja dados que precisam ser modificados, é um bloqueio exclusivo (X). É uma operação de dois estágios no sentido de que há dados que precisam ser pesquisados para determinar quais/se os dados precisam ser modificados. O bloqueio de atualização existirá para isso (ou tentará ser obtido durante a operação). Então, quando os dados precisarem ser modificados, o bloqueio de atualização será convertido em um bloqueio exclusivo.
A razão por trás desse mecanismo de bloqueio é evitar o bloqueio do cenário de atualização de dados. Por favor, veja a postagem de Kalen Delaney sobre mais detalhes sobre isso.
Veja abaixo como exemplo:
Execute isso para a conexão 1...
Em seguida, em outra sessão, tente a seguinte atualização:
O que temos aqui é um bloqueio de atualização que está esperando porque já existe um bloqueio exclusivo no recurso que o bloqueio de atualização está tentando obter (um bloqueio de atualização não é compatível com um bloqueio exclusivo). O cenário acima é usado para "interromper" a conversão do bloqueio de atualização em bloqueio exclusivo.
Você pode ver isso olhando para o
sys.dm_tran_locks
DMV:Você deve ter resultados semelhantes para a saída da consulta acima: