Applies ToSQL Server 2008 Service Pack 4 SQL 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:

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.

Behöver du mer hjälp?

Vill du ha fler alternativ?

Utforska prenumerationsförmåner, bläddra bland utbildningskurser, lär dig hur du skyddar din enhet med mera.

Communities hjälper dig att ställa och svara på frågor, ge feedback och få råd från experter med rika kunskaper.