REVISIÓN: No se escalan los bloqueos de una tabla cuando se insertan muchas filas en una tabla en SQL Server 2008 o en SQL Server 2008 R2

Se aplica a: Microsoft SQL Server 2008 Service Pack 4Microsoft SQL Server 2008 R2 Service Pack 3

Síntomas


Imagine la siguiente situación:
  • Insertar varias filas en una tabla en Microsoft SQL Server 2008 o en SQL Server 2008 R2 mediante una de las siguientes consultas:
    • INSERT INTO <target_table> SELECT * FROM <target_table> WHERE <predicate>
    • SELECT * INTO <target_table> FROM <source_table> WHERE <predicate>
    Notas
    • El marcador de posición < target_table > representa el nombre de la tabla de destino real.
    • El marcador de posición < predicado > representa el predicado real.
    • El marcador de posición < source_table > representa la tabla de origen real.
  • Se ha superado el umbral de escalada del bloqueo de la tabla.
En este escenario, el motor de base de datos no escalar los bloqueos de la tabla.

Causa


Este problema se produce porque SQL Server no cuentan internamente los nuevos bloqueos generados por las operaciones de INSERCIÓN. Por lo tanto, el umbral de escalada del bloqueo no podría activarse cuando sea necesario.

Solución


Información del Service pack para SQL Server 2008

Para resolver este problema, obtenga el service pack más reciente para SQL Server 2008.For obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
968382 Cómo obtener el Service Pack más reciente para SQL Server 2008

Información del Service pack para SQL Server 2008 R2

Para resolver este problema, obtenga el service pack más reciente para SQL Server 2008 R2. Para obtener más información, haga clic en el siguiente número de artículo para verlo en Microsoft Knowledge Base:
2527041Cómo obtener el service pack más reciente para SQL Server 2008 R2

Estado


Microsoft ha confirmado que se trata de un problema de los productos de Microsoft recogidos en la sección "Se aplica a".Este problema se corrigió primero en SQL Server 2008 Service Pack 2 para SQL Server 2008.This problema se corrigió primero en SQL Server 2008 R2 Service Pack 1 para SQL Server 2008 R2.

Más información


Para obtener más información acerca de la extensión de bloqueo, visite el siguiente sitio Web de Microsoft TechNet:Para determinar si se escalan los bloqueos de una tabla, ejecute las siguientes instrucciones de 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 
Si se escalan los bloqueos de la tabla, la última instrucción SELECT devuelve un valor de 1 o 2. Si no se escalan los bloqueos de la tabla, la última instrucción SELECT devuelve un valor de 40,066 o 40,067.