Jak możemy sprawdzić, które blokady bazy danych są stosowane w odniesieniu do których wierszy względem partii zapytania?
Jakieś narzędzie, które podkreśla blokowanie poziomu wierszy tabeli w czasie rzeczywistym?
DB: SQL Server 2005
źródło
Jak możemy sprawdzić, które blokady bazy danych są stosowane w odniesieniu do których wierszy względem partii zapytania?
Jakieś narzędzie, które podkreśla blokowanie poziomu wierszy tabeli w czasie rzeczywistym?
DB: SQL Server 2005
Aby dodać do innych odpowiedzi, sp_lock
można również użyć do zrzucenia informacji o pełnej blokadzie wszystkich uruchomionych procesów. Wynik może być przytłaczający, ale jeśli chcesz dokładnie wiedzieć, co jest zablokowane, warto go uruchomić. Zwykle używam go razem z, sp_who2
aby szybko rozwiązać problemy z blokowaniem.
Istnieje wiele różnych wersji „bardziej przyjaznych” sp_lock
procedur dostępnych online, w zależności od wersji programu SQL Server, o którym mowa.
W twoim przypadku SQL Server 2005 sp_lock
jest nadal dostępny, ale jest przestarzały, więc teraz zaleca się używanie sys.dm_tran_locks
widoku do tego rodzaju rzeczy. Możesz znaleźć przykład, jak „toczyć swoją własną” funkcję sp_lock tutaj .
Nie pokazuje to dokładnie, które wiersze są zablokowane, ale może ci to pomóc.
Możesz sprawdzić, które instrukcje są blokowane, uruchamiając to:
select cmd,* from sys.sysprocesses
where blocked > 0
Poinformuje również, na co czeka każdy blok. Możesz więc prześledzić to aż do końca, aby zobaczyć, która instrukcja spowodowała pierwszy blok, który spowodował inne bloki.
Edytuj, aby dodać komentarz od @MikeBlandford :
Zablokowana kolumna wskazuje pająk procesu blokowania. Możesz uruchomić kill {spid}, aby to naprawić.
Możesz znaleźć aktualne blokady w tabeli , wykonując zapytanie.
Zobacz sys.dm_tran_locks
Jeśli istnieje wiele instancji tego samego request_owner_type , kolumna request_owner_id jest używana do rozróżnienia każdej instancji. W przypadku transakcji rozproszonych kolumny request_owner_type i request_owner_guid będą zawierać różne informacje o encji.
Na przykład sesja S1 posiada współdzieloną blokadę w tabeli Tabela1; a transakcja T1, która działa w ramach sesji S1, również posiada współdzieloną blokadę w tabeli Table1. W takim przypadku kolumna resource_description, która jest zwracana przez sys.dm_tran_locks , pokaże dwa wystąpienia tego samego zasobu. Request_owner_type kolumna pokazuje jeden przykład jako sesji, a drugi jako transakcji. Ponadto kolumna resource_owner_id będzie miała różne wartości.
źródło
Używam dynamicznego widoku zarządzania (DMV) do przechwytywania blokad, a także identyfikatora obiektu lub identyfikatora partycji zablokowanego elementu.
(MUSISZ przejść do bazy danych, którą chcesz obserwować, aby uzyskać identyfikator_obiektu)
źródło
sp_who2
isys.dm_os_waiting_task
(obie próbują zaktualizować tę samą tabelę). Ale twoje oświadczenie nie zwraca żadnych wierszy. Jakieś pomysły?Możesz również użyć wbudowanej
sp_who2
procedury składowanej, aby uzyskać bieżące zablokowane i blokujące procesy w wystąpieniu SQL Server. Zwykle uruchamiasz to razem z wystąpieniem programu SQL Profiler, aby znaleźć proces blokowania i przyjrzeć się najnowszemu poleceniu, które zostało wydane w profilerze.źródło
Szczegóły znajdziesz w poniższym skrypcie.
źródło