Sintomas
Considere o seguinte cenário:
-
Você insere várias linhas em uma tabela no Microsoft SQL Server 2008 ou no SQL Server 2008 R2 usando uma das seguintes consultas:
-
INSERT INTO <target_table> SELECT * FROM <target_table> WHERE <predicate>
-
SELECT * INTO <target_table> FROM <source_table> WHERE <predicate>
Observações
-
O espaço reservado <target_table> representa o nome da tabela de destino real.
-
O predicado<> espaço reservado representa o predicado real.
-
O espaço reservado <source_table> representa a tabela de origem real.
-
-
O limite de escalonamento de bloqueio da tabela foi excedido.
Nesse cenário, o mecanismo de banco de dados não escalona os bloqueios da tabela.
Causa
Esse problema ocorre porque o SQL Server não contará internamente todos os novos bloqueios gerados por operações de inserção. Portanto, o limite de escalonamento de bloqueio pode não ser disparado quando é necessário.
Resolução
Informações do Service Pack para o SQL Server 2008
Para solucionar esse problema, obtenha o Service Pack mais recente para o SQL Server 2008. para obter mais informações, clique no número abaixo para ler o artigo na base de dados de conhecimento da Microsoft:
968382 Como obter o Service Pack mais recente para o SQL Server 2008
Informações do Service Pack para SQL Server 2008 R2
Para solucionar esse problema, obtenha o Service Pack mais recente do SQL Server 2008 R2. Para obter mais informações, clique no número abaixo para ler o artigo na base de dados de conhecimento da Microsoft:
2527041Como obter o Service Pack mais recente para o SQL Server 2008 R2
Status
A Microsoft confirmou que este é um problema nos produtos Microsoft listados na seção "Aplicável a".Esse problema foi corrigido primeiro no SQL Server 2008 Service Pack 2 para SQL Server 2008. esse problema foi corrigido primeiro no SQL Server 2008 R2 Service Pack 1 para SQL Server 2008 R2.
Informações adicionais
Para obter mais informações sobre o escalonamento de bloqueios, acesse o seguinte site do Microsoft TechNet:
Informações gerais sobre o escalonamento de bloqueiosPara determinar se os bloqueios de uma tabela são escalonados, execute as seguintes instruçõ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 escalados, a última instrução SELECT retornará um valor de 1 ou 2. Se os bloqueios da tabela não forem escalados, a última instrução SELECT retornará um valor de 40.066 ou 40.067.