Symptomy
Rozpatrzmy następujący scenariusz:
-
Masz bazę danych programu Microsoft SQL Server 2012 z włączonymi opcjami ALLOW_SNAPSHOT_ISOLATION i READ_COMMITTED_SNAPSHOT .
-
Masz co najmniej trzy jednoczesne kwerendy, które są uruchamiane w tej samej tabeli.
-
W kwerendach jest używana Wskazówka dotycząca kwerendy (TABLOCK, UPDLOCK) .
-
Wszystkie zapytania są zawijane w jawnej instrukcji BEGIN Trans, ale instrukcja commit transładunek nie jest wykonywana.
Gdy pierwsza kwerenda zostanie zatwierdzona w tym scenariuszu, jedna z pozostałych zapytań zostanie zakleszczenia. Gdy READ_COMMITTED_SNAPSHOT jest włączony wraz z wskazówkami dotyczącymi zapytań TABLOCK i UPDLOCK , sesje zajmują w tabeli do IX blokad. Zakleszczenie następuje wtedy, gdy dwie sesje współbieżne próbują ponownie przekonwertować blokadę IX na X blokadę X w tym samym czasie. Jeśli READ_COMMITTED_SNAPSHOT jest wyłączona, sesje uzyskają sześć blokad, które nie będą zakleszczeni po przekonwertowaniu na blokady X. Poprawka eliminuje to zachowanie przez udzielenie LCK_M_SCH_S blokad zamiast IX blokad, gdy READ_COMMITTED_SNAPSHOT jest używana z wskazówkami TABLOCK i UPDLOCK .UwagaTen problem występuje również w programie Microsoft SQL Server 2008 R2. Poprawka dla programu SQL Server 2008 R2 zostanie wkrótce opublikowana.
Rozwiązanie
Ten problem został po raz pierwszy rozwiązany w poniższej zbiorczej aktualizacji programu SQL Server.
Zbiorcza aktualizacja 8 dla programu SQL Server 2012 z dodatkiem SP1 /en-us/help/2917531
Każda nowa Zbiorcza aktualizacja programu SQL Server zawiera wszystkie poprawki i wszystkie poprawki zabezpieczeń uwzględnione w poprzedniej aktualizacji zbiorczej. Zapoznaj się z najnowszymi aktualizacjami zbiorczymi dla programu SQL Server:
Stan
Firma Microsoft potwierdziła, że jest to problem występujący w produktach firmy Microsoft wymienionych w sekcji "dotyczy".