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:
2527041Skaffa 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:
Allmän information om låsning av låsOm 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.