Symptomy
Rozpatrzmy następujący scenariusz:
-
Do tabeli w programie Microsoft SQL Server 2008 lub SQL Server 2008 R2 wstawianych jest wiele wierszy, korzystając z jednego z następujących zapytań:
-
INSERT INTO <target_table> SELECT * FROM <target_table> WHERE <predicate>
-
SELECT * INTO <target_table> FROM <source_table> WHERE <predicate>
Uwagi
-
Symbol zastępczy <target_table> reprezentuje rzeczywistą nazwę tabeli docelowej.
-
Predykat<> symbol zastępczy reprezentuje rzeczywisty predykat.
-
Symbol zastępczy <source_table> reprezentuje rzeczywistą tabelę źródłową.
-
-
Próg eskalacji blokady tabeli jest przekroczony.
W tym scenariuszu aparat bazy danych nie dokonuje eskalacji blokad tabeli.
Przyczyna
Ten problem występuje, ponieważ program SQL Server nie zlicza wewnętrznie wszystkich nowych blokad generowanych przez operacje INSERT. Dlatego Próg eskalacji blokady może nie zostać wyzwolony, jeśli jest wymagany.
Rozwiązanie
Informacje o dodatku Service Pack dla programu SQL Server 2008
Aby rozwiązać ten problem, Uzyskaj najnowszy dodatek Service Pack dla programu SQL Server 2008. Aby uzyskać więcej informacji, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
968382 Jak uzyskać najnowszy dodatek Service Pack dla programu SQL Server 2008
Informacje o dodatku Service Pack dla programu SQL Server 2008 R2
Aby rozwiązać ten problem, Uzyskaj najnowszy dodatek Service Pack dla programu SQL Server 2008 R2. Aby uzyskać więcej informacji, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
2527041Jak uzyskać najnowszy dodatek Service Pack dla programu SQL Server 2008 R2
Stan
Firma Microsoft potwierdziła, że jest to problem występujący w produktach firmy Microsoft wymienionych w sekcji "dotyczy".Ten problem został po raz pierwszy rozwiązany w programie SQL Server 2008 z dodatkiem Service Pack 2 dla programu SQL Server 2008. ten problem rozwiązano po raz pierwszy w programie SQL Server 2008 R2 z dodatkiem Service Pack 1 dla programu SQL Server 2008 R2
Więcej informacji
Aby uzyskać więcej informacji na temat eskalacji blokady, odwiedź następującą witrynę internetową Microsoft TechNet:
Informacje ogólne o eskalacji blokadyAby określić, czy blokady tabeli są eskalacjne, uruchom następujące instrukcje języka 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
Jeśli blokady tabeli są eskalacją, ostatnią instrukcję SELECT zwraca wartość 1 lub 2. Jeśli blokady tabeli nie są eskalacjne, Ostatnia instrukcja SELECT zwróci wartość 40 066 lub 40 067.