Udostępnij za pośrednictwem


Deadlocking

Zakleszczenie występuje, gdy dwa lub więcej zadań trwale blok drugiej przez każdego zadania posiadające blokada zasób, który chcesz zablokować inne zadania.Na przykład:

  • Transakcji a nabywa blokada udziału w wierszu 1.

  • B transakcji nabywa udział blokada w wierszu 2.

  • Transakcja żąda teraz blokada na wyłączność z wiersza 2, a jest zablokowana, dopóki transakcja b zakończy się i zwalnia blokadę udział ma w wierszu 2.

  • B transakcji teraz żądania blokada na wyłączność z wiersza 1, a jest zablokowana, dopóki transakcja a zakończy się i zwalnia blokadę udział ma w wierszu 1.

Nie można ukończyć transakcji A, aż ukończy transakcji B, ale transakcja b jest blokowany przez transakcję A.Warunek ten jest również nazywany zależność cykliczna: Transakcji a bazuje na transakcji b i b transakcji zamyka okręgu przez zależność transakcji A.

Zarówno transakcji do zakleszczenie będzie czekać nieskończona, chyba że zakleszczenie jest dzielony przez proces zewnętrznego.The Microsoft Aparat baz danych programu SQL Server deadlock monitor periodically checks for tasks that are in a deadlock.Jeśli monitor wykryje zależność cykliczna, wybiera jednego z zadań jako ofiarą i kończy jego transakcji z powodu błędu.Dzięki temu inne zadania do wykonania transakcji.Aplikacja transakcji, która zakończone z powodu błędu można ponownie transakcję, która zwykle kończy się po zakończeniu zakleszczonej transakcji.

Za pomocą niektórych kodowania konwencje w aplikacjach zmniejsza ryzyko, że aplikacje spowoduje zakleszczenia.Aby uzyskać więcej informacji, zobacz Minimalizowanie zakleszczenia.

Deadlocking jest często mylić z normalnym blokowania.Podczas transakcji żądań blokowania zasób zablokowany przez inną transakcję, wnioskujące transakcji czeka, aż blokada jest zwalniana.Domyślnie SQL Server Transakcje nie czas out, chyba że LOCK_czassię jest zestawem.Wnioskujące transakcji jest bblokadaed nie martwychblokadaed, ponieważ transakcję wnioskujący ma nie dokonały bblokada posiadającego transakcji blokada.Ostatecznie będącego właścicielem transakcji będzie zakończyć i zwolnić blokadę, a następnie transakcję wnioskujący otrzyma blokada kontynuować.

Zakleszczenia są czasem nazywane zabójczej objęło.

Zakleszczenie jest warunek, który może wystąpić w systemie z wielu wątków nie tylko na system zarządzania relacyjnymi bazami danychi mogą być zasoby inne niż blokad dla obiektów bazy danych.Na przykład wątek wielowątkowe systemu operacyjnego może nabyć jeden lub więcej zasobów, takich jak bloków pamięci.Jeśli zasób przejmowanej obecnie jest własnością innego wątku, pierwszy wątek może mieć oczekiwania wątek będący właścicielem zwolnienie miejsce docelowe zasobów.Mówi, że wątku oczekiwania ma zależności wątek będący właścicielem dla danego zasób.W wystąpienie z Aparat baz danych, sesje można zakleszczenie nabywającego nondatabase zasobów, takich jak pamięć lub wątków.

Diagram pokazujący zakleszczenie transakcji

Na ilustracji, transakcji T1 bazuje na transakcji T2 dla części blokada tabela zasób.Podobnie, transakcji T2 bazuje na transakcji T1 dla dostawcy blokada tabela zasób.Ponieważ te zależności formularzu cyklu jest zakleszczenie między transakcjami T1 i T2.

Zakleszczenia może również wystąpić, gdy tabela jest podzielony na partycje i zestaw LOCK_ESCALATION ALTER TABLE jest ustawiony na AUTO.Po LOCK_ESCALATION zestaw Auto zwiększa współbieżność, umożliwiając Aparat baz danych do blokada tabela partycji poziom HoBT zamiast poziom tabela.Jednakże gdy oddzielne transakcje przytrzymaj partycji blokadas w tabela i chcesz blokada gdzieś na innej partycji transakcji powoduje martwychblokada.Można uniknąć tego typu zakleszczenie przez ustawienie LOCK_ESCALATION w tabela; Chociaż to ustawienie zmniejszy współbieżność wymuszając dużych aktualizacji partycji czekać na blokada tabela.