Jeśli na Twoim komputerze pojawił się nowy błąd ofiary awarii, mamy nadzieję, że ta broszura użytkownika pomoże Ci go rozwiązać.
Zatwierdzono: Fortect
Błąd “Transakcja już zablokowana” występuje, gdy dwie być może więcej sesji czekają na zablokowanie odniesienia, które zostało już przejęte przez inną sesję zdjęciową w tym samym łańcuchu przycinania . W związku z tym sesje linków do witryn sieci Web nie mogą zostać zakończone i SQL Server musi się zaangażować, aby rozwiązać problem. Odblokowuje gwarantowany wybór jednej z sesji, a główna ofiara zabija go, aby można było kontynuować kilka innych sesji treningowych. W tym scenariuszu określony patron otrzymuje następujący komunikat o błędzie:
Gospodarka (identyfikator procesu) została zablokowana z powodu innych procesów w zasobach blokujących i była zwykle ulubiona jako ofiara impasu. Wykonaj transakcję jeszcze raz.
i ta zakończona sesja zostanie usunięta. Zazwyczaj ofiarą jest sesja, która oczekuje na wycofanie najmniejszego obciążenia.
Dlaczego awarie programu SQL Server?
Aby zrozumieć, która „transakcja (identyfikator procesu) na zgromadzonych zasobach utknęła w innym procesie i padła ofiarą impasu”. Ponownie wykonaj tę transakcję z bardzo błędem. Weźmy bardzo prosty przykład.
W rezultacie stworzymy dwa stoły do jadalni „t1” i „t2”, które zawierają jeden wałek liczb całkowitych:
UTWÓRZ TABELĘ t1 (int id)UTWÓRZ TABELĘ t2 (id int)
WSTAWIĆ DO t1 (id)WYBIERZ najpierw P ŁĄCZENIE WSZYSTKICHWYBIERZ WSZYSTKIE 2 UNIAWYBIERZ 3SPACEROWAĆWSTAWIĆ W t2 (id)WYBIERZ 1 POŁĄCZENIE WSZYSTKIEWYBIERZ 8 POŁĄCZENIE 3
Teraz to wszystkoselect uważa, że większość ludzi rozpoczęła transakcję, która usuwa wiersze wyposażone w id = 2 z t1:
ROZPOCZNIJ TRANSMISJĘUSUŃ Z t1 GDZIE id = 2
Załóżmy, że większość innych transakcji usuwa te same wiersze w dowolnym miejscu obu tabel:
ROZPOCZNIJ TRANSMISJĘUSUŃ t2 O id = 2USUŃ Z t1 WHERE id =
Musisz poczekać, aż pierwsze żądanie faktycznie się zakończy, a tabela t1 będzie wolna.
Ale załóżmy, że pierwsza transakcja może teraz wyselekcjonować odpowiedni wiersz z drugiej tabeli:
DELETE t2 WHERE id = 2
Po tym nagłówku powinien pojawić się następujący komunikat o błędzie uszkodzenia pliku:
Transakcja (identyfikator procesu) została wypchana z powodu zakleszczenia w czasie i nagrzaniu innym procesem i została wybrana jako konkretna ofiara zakleszczenia. Bez wątpienia wykonaj transakcję od nowa.
Wynika to z sytuacji, w której przy pierwszej zdefiniowanej transakcji czeka na jedną dodatkową (do wolnego t2), podczas gdy transakcja jest poza tą oczekującą na pierwotną (w t1) w nowym określonym czasie.
Jak analizować schematy blokowania
Blokowanie to zazwyczaj blok informacji pokazujący, jaka taktyka i co więcej sesje są powiązane z trudnością. Jest to przydatne, aby zrozumieć, dlaczego wystąpił problem.
Przed serwerami sql 2008 zbieranie tych informacji wymagało parowania śladów po stronie serwera lub włączania flag wyszukiwania podczas oczekiwania na zawieszenie. Począwszy od SQL Server 2008, wszystko jest prostsze. Możesz zapamiętać dowolne blokady a posteriori zgodnie z wykresami kursu zaawansowanego „zdrowie_systemu”. Aby wykonać powyższe, przejdź do Zarządzaj> Zaawansowane zdarzenia> Sesje> kondycja_systemu> package0.event_file i kliknij Pokaż cel. Dane …
Tysiące wydarzeń są wyświetlane w otwartej sali, powiedziałbym w oknie. Tam cała Twoja rodzina znajdzie rekordy blokujące oznaczone jako „xml_deadlock_report”. Wybierzmy ten, który właśnie wymodelowaliśmy
oraz , spójrz na wykres trudności. Funkcje formularzy (w XML), w tym sekcje zasobów i procesów.
Obszar zasobów wyświetla dokładną listę wszystkich zablokowanych zasobów:
Pokazuje, o co kłóciły się procesy, a następnie, co było związane z rodzajami blokady, która je spowodowała. Zwraca dwa lub dodatkowe rekordy. Każdy rekord zawiera opis pojedynczego zasobu poprzez implementację list procesów, które spowodowały blokadę lub nabyły blokadę podczas gdy zasób. Blokuje sekcję, która jest głównie związana z kluczem, identyfikatorem RID, nową stroną i tabelą.
Po biurze wsparcia przejdźmy do działu „Procesy” handlu zagranicznego, aby dowiedzieć się, co dokładnie te procesy robiły.
Typ sekcji operacji wyświetla szczegółowe informacje o wszystkich rozliczeniach zadłużenia, które zwykle utknęły
Zawiera wpisy dotyczące wątków, które biorą udział tylko w blokowaniu i zawiera ważne przewodniki, takie jak nazwy hostów, loginy, zakres izolacji, czas, parametry programu itp. Ale najcenniejszą częścią informacji jest izolacja każdego żądania i jednego konkretnego poziom szczegółowości, który do tej pory prowadził do impasu.
Jak wybrać ofiarę zablokowania
Jeśli nie możesz być w sąsiedztwie, unikaj możliwości określenia, który proces musi umrzeć, gdy po prostu się zawiesza. SQL Server czyni tę decyzję ofiarą w trudnej sytuacji na podstawie dwóch czynników: serii DEADLOCK_PRIORITY dla każdej sesji oraz ilości pracy, jaką SQL Server musi wykonać, aby wycofać typ transakcji.
Parametr DEADLOCK_PRIORITY może być ustawiony przez osobę a na WYSOKI, NORMALNY, NISKI lub znakomitą liczbę całkowitą od -10 do 10. DEADLOCK_PRIORITY jest domyślnie szeregiem do NORMALNY (0). Użyj składni czytania, aby upewnić się, że ustawiłeś priorytet blokowania:
Zatwierdzono: Fortect
Fortect to najpopularniejsze i najskuteczniejsze narzędzie do naprawy komputerów na świecie. Miliony ludzi ufają, że ich systemy działają szybko, płynnie i bez błędów. Dzięki prostemu interfejsowi użytkownika i potężnemu silnikowi skanowania, Fortect szybko znajduje i naprawia szeroki zakres problemów z systemem Windows - od niestabilności systemu i problemów z bezpieczeństwem po zarządzanie pamięcią i wąskie gardła wydajności.
ZAINSTALUJ DEADLOCK_PRIORITY @deadlock_intvar:: równa się â € ¦
Na przykład, rzeczywista sesja o priorytecie trudności NORMALNY zostanie wybrana jako zablokowana dla danej osoby, jeśli uczestniczy w łańcuchu bloków, w którym inne sesje ustawiają priorytet drogi na WYSOKI lub liczbę całkowitą większą od 0. inne sesje LOW mają priorytet blokady dla wartości całkowitej mniejszej niż zero.
NISKI rzeczywiście wynosi -5, NORMALNY został nazwany WYSOKI o wynosi 5. Innymi słowy, uruchom następujące polecenia, aby ustawić blokadę rozpatrywania na NORMALNY:
SET DEADLOCK_PRIORITY NORMALNY;Idź
SET DEADLOCK_PRIORITY 0;Idź
Aby sprawdzić, czy rzeczywiście występuje problem z blokowaniem sesji, możesz użyć przyklejania do zapytania:
SELECT session_id, DEADLOCK_PRIORITY FROM sys.dm_exec_sessions WHERE SESSION_ID = @@ SPID
Jak uniknąć zakleszczeń w SQL Server
Jako programista powinieneś zaprojektować moduły magazynu danych, aby zminimalizować ryzyko zablokowania. Oto kilka pomocnych wskazówek:
Upewnij się, że określone aplikacje uzyskują dostęp do wszystkich udostępnionych obiektów w określonej kolejności
Przyspiesz teraz wydajność swojego komputera dzięki temu prostemu pobieraniu.
Sprawdź menedżera system_health przez zakleszczenia.Utwórz rozszerzoną sesję zdarzeń z przechwytywaniem zakleszczeń.Przeanalizuj nowe wykresy raportowania awarii, aby znaleźć problem.Kiedy na pewno wprowadzimy dalsze ulepszenia lub zwiększymy liczbę zablokowanych żądań.
Domyślnie SQL Server wybiera złożoność poświęcenia po najmniej kosztownej transakcji do wycofania. Po prostu ułóż, najmniej lotny materiał jest uważany za dobrą liczbę dochodową bazę danych. Następnie zostanie wybrany proces z najbardziej podstawową blokadą podstawową, ponieważ jest ona uważana za ofiarę blokady.
Zakleszczenie występuje, gdy transakcja chce zaktualizować symbol, który został odświeżony przez inny kontrakt, który nadal jest odpowiedni (jeszcze nie przydzielony). Jak uniknąć tych błędów: Jest to normalne w przypadku awarii bazy danych wielu użytkowników.