Abaixo, o cenário de duas sessões tentando atualizar a mesma linha foi fornecido por Paul White.
Cenário 1:
- A sessão 1 obtém um
U
bloqueio na linha da tabela base durante a leitura.- Blocos da sessão 2, aguardando aquisição
U
na mesma linha da tabela base.- A sessão 1 define o valor como 10 e confirma.
- A sessão 2 adquire seu
U
bloqueio e não encontra nada para fazer, pois Value != 0 agora.Resultado: o valor é definido como 10.
Com base em Paul, a sessão 2 já localizou a linha que precisa ser atualizada, mas foi bloqueada. Quando o bloqueio acabar e a sessão 2 obtiver o bloqueio U, será necessário verificar a condição novamente? Estou entendendo certo? Para mim é meio estranho. A sessão localizou esta linha porque avaliou o filtro que leva à identificação desta linha. Por que é necessário verificar a condição novamente antes da atualização real?
A resposta está implícita no texto que você postou.
A
Value = 0
condição foi atendida inicialmente, mas no momento em que oU
bloqueio é obtido, aValue = 0
condição não é mais atendida.O SQL Server lê apenas valores da linha após a aquisição do bloqueio.
A instrução SQL
É suposto atualizar as linhas
ID = 1 AND Value = 0
no momento da atualização . Não em uma versão anterior.É por isso que essas abordagens para testar violações de simultaneidade otimistas funcionam.