KB2448971-åtgärd: lås av en tabell är inte eskalerade när du infogar många rader i en tabell i SQL Server 2008 eller i SQL Server 2008 R2

Gäller för: SQL Server 2008 Service Pack 4SQL Server 2008 R2 Service Pack 3

Symptom


Tänk dig följande situation:
  • Du infogar många rader i en tabell i Microsoft SQL Server 2008 eller i SQL Server 2008 R2 genom att använda någon av följande frågor:
    • INSERT INTO <target_table> SELECT * FROM <target_table> WHERE <predicate>
    • SELECT * INTO <target_table> FROM <source_table> WHERE <predicate>
    Kommentarer
    • <target_table> plats hållaren representerar den faktiska mål tabellens namn.
    • <predikat> placeholder representerar det faktiska predikatet.
    • <source_table> plats hållaren representerar den faktiska käll tabellen.
  • Tröskelvärdet för låsning av tabellen har överskridits.
I det här scenariot kommer inte databas motorn att eskalera tabellen.

Orsak


Det här problemet uppstår eftersom SQL Server inte internt räknar alla nya lås som genereras av INSERT-åtgärder. Därför kanske tröskelvärdet för låsning av lås inte utlöses när det behövs.

Lösning


Information om Service Pack för SQL Server 2008

Lös problemet genom att skaffa den senaste Service Pack-versionen för SQL Server 2008. Klicka på följande artikel nummer för att visa artikeln i Microsoft Knowledge Base:
968382 Skaffa den senaste Service Pack-versionen för SQL Server 2008

Information om Service Pack för SQL Server 2008 R2

Lös problemet genom att skaffa den senaste Service Pack-versionen för SQL Server 2008 R2. Mer information får du om du klickar på följande artikel nummer och läser artikeln i Microsoft Knowledge Base:
2527041 Skaffa den senaste Service Pack-versionen för SQL Server 2008 R2

Status


Microsoft har bekräftat att det här är ett problem i Microsoft-produkterna som nämns i "gäller".Det här problemet korrigerades först i SQL Server 2008 Service Pack 2 för SQL Server 2008. det här problemet korrigerades först i SQL Server 2008 R2 Service Pack 1 för SQL Server 2008 R2.

Mer information


Mer information om låsning finns på följande Microsoft TechNet-webbplats:Om du vill ta reda på om låsen för en tabell eskaleras kör du följande Transact-SQL-uttryck:
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 
Om lås av tabellen är eskalerat returnerar det sista SELECT-uttrycket värdet 1 eller 2. Om lås av tabellen inte är eskalerade returnerar det sista SELECT-uttrycket ett värde av antingen 40 066 eller 40 067.