Příznaky
Zvažte následující scénář:
-
Do tabulky Microsoft SQL serveru 2008 nebo SQL Server 2008 R2 vložíte mnoho řádků pomocí jednoho z následujících dotazů:
-
INSERT INTO <target_table> SELECT * FROM <target_table> WHERE <predicate>
-
SELECT * INTO <target_table> FROM <source_table> WHERE <predicate>
Poznámky
-
Zástupný symbol <>target_table představuje skutečný název cílové tabulky.
-
<predikát> zástupný symbol představuje skutečný predikát.
-
Zástupný symbol <source_table> představuje skutečnou zdrojovou tabulku.
-
-
Překročena prahová hodnota eskalace zámku tabulky.
V tomto scénáři databázový stroj nestupňování uzamkne.
Příčina
K tomuto problému dochází, protože SQL Server nepočítá interně všechny nové zámky generované operacemi INSERT. Proto se prahová hodnota pro eskalaci zámku nemusí aktivovat, když je to povinné.
Řešení
Informace o aktualizaci Service Pack pro SQL Server 2008
Tento problém vyřešíte pomocí nejnovější aktualizace Service Pack pro SQL Server 2008. Další informace najdete v následujícím článku znalostní báze Microsoft Knowledge Base:
968382 Jak získat nejnovější aktualizaci Service Pack pro SQL Server 2008
Informace o aktualizaci Service Pack pro SQL Server 2008 R2
Tento problém vyřešíte pomocí nejnovější aktualizace Service Pack pro SQL Server 2008 R2. Další informace najdete v následujícím článku znalostní báze Microsoft Knowledge Base:
2527041Jak získat nejnovější aktualizaci Service Pack pro SQL Server 2008 R2
Stav
Společnost Microsoft potvrzuje, že se jedná o problém v produktech této společnosti, které jsou uvedeny v části Informace v tomto článku jsou určeny pro produkt.Tento problém byl poprvé opraven v aktualizaci SQL Server 2008 Service Pack 2 pro SQL Server 2008. Tento problém byl poprvé opraven v SQL serveru 2008 R2 Service Pack 1 pro SQL Server 2008 R2.
Další informace
Další informace o eskalaci zámku najdete na následujícím webu Microsoft TechNet:
Obecné informace o eskalaci zámkuPokud chcete zjistit, jestli jsou zámky tabulky eskalacé, spusťte následující příkazy 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
Pokud jsou zámky tabulky eskalacé, vrátí poslední příkaz SELECT hodnotu 1 nebo 2. Pokud zámky tabulky nejsou eskalacé, vrátí poslední příkaz SELECT hodnotu buď 40 066 , nebo 40 067.