Geralmente, o SQL Server aceita bloqueios durante as atualizações. Ele também oferece suporte ao escalonamento de bloqueio :
Escalação de bloqueio é o processo de conversão de muitos bloqueios de granularidade em menos bloqueios de granularidade, reduzindo a sobrecarga do sistema enquanto aumenta a probabilidade de contenção de simultaneidade.
Durante um ROLLBACK de transação, o SQL Server reduz os bloqueios, colocando de volta os bloqueios refinados?
O SQL Server não reduz o bloqueio.
Eu investiguei usando uma tabela " Numbers " com 100.000 linhas. Empiricamente, a atualização de 5.000 linhas produziu um número correspondente de bloqueios RID em
sys.dm_tran_locks
. A atualização de mais 10.000 linhas causou o escalonamento para um único bloqueio de tabela. Isso foi consistentemente reproduzível. Para minimizar os objetos envolvidos a tabela era um heap sem índices.Usei o rastreamento de evento estendido para capturar
lock_acquired
elock_released
eventos. Para facilitar a análise, usei traços separados durante as fases UPDATE e ROLLBACK.Duas sessões (janelas do SSMS) foram usadas - uma para as instruções DML e outra para o rastreamento DDL. Não pude usar uma única sessão, pois queria parar e iniciar rastreamentos enquanto a transação está aberta e isso não é permitido. O nível de isolamento é READCOMITTED.
O resultado de
select @@VERSION
éOs passos dados foram
Crie e inicie o rastreamento Acquire.
Comece uma transação e atualize 5.000 linhas.
Atualize mais 10.000 linhas.
Pare o rastreamento de aquisição.
Verifique se há bloqueios consultando
sys.dm_tran_locks
(2 - DB, tabela).Crie e inicie o rastreamento de liberação.
Reverter a transação.
Pare o rastreamento de liberação.
Arrumar
Se ocorresse o desescalonamento de bloqueio, eu esperaria uma simetria completa nos dois arquivos de rastreamento - cada bloqueio adquirido durante UPDATE e o escalonamento teria uma liberação correspondente durante ROLLBACK. O que observei:
foi de 383.889 linhas e 166 linhas, respectivamente. Examinando o XML do evento para o arquivo de rollback, há apenas um evento relacionado a RIDs, PAGEs ou OBJECTS - a liberação de um bloqueio X na tabela. Concluo com isso que os bloqueios não foram desescalados durante a reversão.
Isso ecoa a documentação para reverter para um ponto de salvamento nomeado: