Sintomas
Considere o seguinte cenário:
-
Insere muitas linhas numa tabela no Microsoft SQL Server 2008 ou no SQL Server 2008 R2 utilizando uma das seguintes consultas:
-
INSERT INTO <target_table> SELECT * FROM <target_table> WHERE <predicate>
-
SELECT * INTO <target_table> FROM <source_table> WHERE <predicate>
Notas
-
O espaço reservado <target_table> representa o nome da mesa-alvo real.
-
O <predicado> espaço reservado representa o predicado real.
-
O espaço reservado <source_table> representa a tabela de origem real.
-
-
O limiar de escalada de bloqueio da tabela é ultrapassado.
Neste cenário, o motor da base de dados não aumenta as fechaduras da tabela.
Causa
Este problema ocorre porque o SQL Server não conta internamente todos os novos bloqueios que são gerados pelas operações INSERT. Por conseguinte, o limiar de escalada do bloqueio pode não ser acionado quando é necessário.
Resolução
Informações do pacote de serviços para SQL Server 2008
Para resolver este problema, obtenha o mais recente pacote de serviços para SQL Server 2008.Para mais informações, clique no seguinte número de artigo para ver o artigo na Base de Conhecimento da Microsoft:
968382 Como obter o mais recente pacote de serviços para SQL Server 2008
Informações do pacote de serviços para SQL Server 2008 R2
Para resolver este problema, obtenha o mais recente pacote de serviços para SQL Server 2008 R2. Para mais informações, clique no seguinte número de artigo para ver o artigo na Base de Conhecimento da Microsoft:
2527041Como obter o mais recente pacote de serviços para SQL Server 2008 R2
Estado
A Microsoft confirmou que este problema ocorre nos produtos da Microsoft listados na secção "Aplica-se a".Este problema foi corrigido pela primeira vez no SQL Server 2008 Service Pack 2 para SQL Server 2008.Este problema foi corrigido pela primeira vez no SQL Server 2008 R2 Service Pack 1 para SQL Server 2008 R2.
Mais Informações
Para obter mais informações sobre a escalada de bloqueio, visite o seguinte website da Microsoft TechNet:
Informações gerais sobre a escalada do bloqueioPara determinar se as fechaduras de uma mesa são escaladas, executar as seguintes declarações Transact-SQL:
USE tempdbGOCREATE TABLE x (i INT NOT NULL PRIMARY KEY)GOBEGIN TRANINSERT xSELECT TOP (40000)ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rFROM master..spt_values a, master..spt_values bORDER BYrSELECTCOUNT(*)FROM sys.dm_tran_locksWHERE request_session_id = @@SPID ROLLBACKGODROP TABLE x
Se os bloqueios da tabela forem escalonados, a última declaração SELECT devolve um valor de 1 ou 2. Se os bloqueios da tabela não forem escalados, a última declaração SELECT devolve um valor de 40.066 ou 40.067.