Fiz essa pergunta em uma entrevista e não tive resposta. Alguém aqui pode explicar?
Fiz essa pergunta em uma entrevista e não tive resposta. Alguém aqui pode explicar?
Respostas:
Bloqueios de banco de dados podem existir em linhas, páginas ou tabelas ou índices inteiros. Quando uma transação está em andamento, os bloqueios mantidos pela transação ocupam recursos. A escalação de bloqueios é onde o sistema consolida vários bloqueios em um nível superior (por exemplo, consolidando vários bloqueios de linha em uma página ou várias páginas em uma tabela inteira) normalmente para recuperar recursos capturados por um grande número de bloqueios refinados.
Isso será feito automaticamente, embora você possa definir sinalizadores nas tabelas (consulte ALTER TABLE nos livros on-line) para controlar a política de escalação de bloqueios nessa tabela específica. Em particular, a escalação prematura ou excessivamente ansiosa de bloqueios costumava ser um problema nas versões mais antigas do Sybase e do SQL Server quando você tinha dois processos gravando linhas separadas na mesma página simultaneamente. Se você voltar o suficiente (IIRC SQL Server 6.5), o SQL Server na verdade não tinha bloqueio de linha, mas só poderia bloquear tabelas ou páginas. Onde isso aconteceu, você pode obter contenção entre inserções de registros na mesma página; frequentemente você colocava um índice em cluster na tabela para que novas inserções fossem para páginas diferentes.
É um método para reduzir a sobrecarga do sistema, convertendo muitos bloqueios de granulação fina em menos bloqueios de granulação grossa. Informações mais detalhadas podem ser encontradas aqui e aqui .
Por exemplo, se você tiver muitos bloqueios (geralmente centenas ou mais) em linhas específicas de uma tabela, depois de exceder o número máximo permitido de bloqueios, eles poderão ser trocados por um bloqueio em toda a tabela.
O SQL Server faz o bloqueio de escalonamento para reduzir a sobrecarga de memória , convertendo vários bloqueios de baixa granulação fina em bloqueios de alto nível de granulação grossa.
É um mito que os bloqueios de linha sejam escalados para bloqueios de página , o mesmo mencionado acima por @ConcernedOfTunbridgeWells está errado.
Se uma tabela tiver muito poucas atualizações de linha, o mecanismo SQL tentará remover os bloqueios de linha nessas linhas ou o bloqueio de página nessas páginas. Digamos que levou Row-Lock. Mas se as atualizações de linha aumentarem o limite (~ 5k bloqueios), em vez de usar vários bloqueios de linha, será necessário um único bloqueio de tabela. Portanto, isso reduz a sobrecarga de memória liberando vários bloqueios de linha e obtém um único bloqueio de tabela, mas aumenta a simultaneidade. O mesmo acontece com o bloqueio de página.
O limite de escalonamento de bloqueios é de pelo menos 5000 bloqueios e, dependendo de vários fatores, uma explicação detalhada do escalonamento de bloqueios foi mencionada aqui no MSDN BoL: https://technet.microsoft.com/en-us/library/ms184286(v = sql.105) .aspx