Quando tenho uma transação com várias consultas, posso testar quais bloqueios são mantidos entre consultas usando waitfor
e verificando o arquivo dm_tran_locks
.
Mas não posso "pausar" uma consulta pela metade. Especificamente, estou me perguntando como essa consulta manterá bloqueios:
update my_table set column1=new_value
where column2=filter_value
Isso levará um bloqueio de atualização desde o início? Ou será necessário um bloqueio compartilhado até determinar as linhas where
especificadas e, em seguida, solicitar um bloqueio U?
Para cada linha que deve ser observada, ela primeiro adquire um bloqueio de atualização. Ele agora verifica se esta linha se qualifica para a modificação.
Ou seja, um bloqueio de atualização dura muito pouco e é difícil pegá-lo na natureza, a menos que seja bloqueado (por outra atualização ou bloqueio exclusivo, por exemplo).
Em relação a quais linhas ele deve observar: Imagine que você tenha um índice na coluna sobrenome e seu predicado de pesquisa para a atualização seja:
O SQL Server pode usar o índice no sobrenome para "dirigir" a atualização. Ou seja, ele encontra o primeiro Menoutis usando o índice na coluna sobrenome e vê se o primeiro nome desse Menoutis é George; e toma medidas como descrevi acima. E então faz o mesmo para cada Menoutis encontrado através desse índice.