KB2448971-FIX: tabeli lukustamine pole eskaleerunud, kui lisate mitu rida tabelisse SQL Server 2008 või SQL Server 2008 R2

Kehtib: SQL Server 2008 Service Pack 4SQL Server 2008 R2 Service Pack 3

Sümptomid


Arvestage järgmise stsenaariumiga.
  • Saate lisada mitu rida tabelisse Microsoft SQL Server 2008 või SQL Server 2008 R2, kasutades ühte järgmistest päringutest.
    • INSERT INTO <target_table> SELECT * FROM <target_table> WHERE <predicate>
    • SELECT * INTO <target_table> FROM <source_table> WHERE <predicate>
    Märkused
    • <target_table> kohatäide tähistab tegelikku sihttabeli nime.
    • <-i > kohatäide tähistab tegelikku eelolevat.
    • <source_table> kohatäide tähistab tegelikku allika tabelit.
  • Tabeli lukustuse suurendamise künnis on ületatud.
Selle stsenaariumi korral ei suurenda andmebaasi mootor tabeli lukke.

Põhjus


See probleem ilmneb seetõttu, et SQL Server ei Loenda sisemiselt kõik uued lukud, mis luuakse toimingute lisamise teel. Seetõttu ei pruugita luku eskaleerumise künnist käivitada, kui see on nõutav.

Lahendus


SQL Server 2008 hoolduspaketi teave

Selle probleemi lahendamiseks Hankige SQL Server 2008 uusim hoolduspakett. Lisateabe saamiseks klõpsake Microsofti teabebaasi (Knowledge Base) artikli kuvamiseks järgmist artiklinumbrit:
968382 SQL Server 2008 uusima hoolduspaketi hankimine

SQL Server 2008 R2 hoolduspaketi teave

Selle probleemi lahendamiseks Hankige SQL Server 2008 R2 uusim hoolduspakett. Lisateabe saamiseks klõpsake Microsofti teabebaasi (Knowledge Base) artikli kuvamiseks järgmist artiklinumbrit:
2527041 SQL Server 2008 R2 uusima hoolduspaketi hankimine

Olek


Microsoft on kinnitanud, et see probleem esineb jaotises "kehtib järgmiste toodete kohta" loetletud Microsofti toodetes.See probleem lahendati kõigepealt SQL Server 2008 Service Pack 2 SQL Server 2008. See probleem lahendati kõigepealt SQL Server 2008 R2 hoolduspaketiga Service Pack 1 SQL Server 2008 R2.

Lisateave


Lisateavet Lock eskaleerumise kohta leiate järgmiselt Microsoft TechNeti veebisaidilt:Kui soovite kindlaks teha, kas tabeli lukud on eskaleerunud, käivitage järgmised Transact-SQL-laused.
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 
Kui tabeli lukud on eskaleerunud, tagastatakse viimase SELECT-lause väärtuseks kas 1 või 2. Kui tabeli lukud pole eskaleerunud, tagastatakse viimase SELECT-lause väärtuseks kas 40 066 või 40 067.