Udostępnij za pośrednictwem


Deadlocking

Zakleszczenie występuje, gdy dwa lub więcej zadań trwale blok sobie nawzajem za poszczególne zadania o blokada do zasób, którego chcesz zablokować inne zadania.Na przykład:

  • Transakcja A nabywa udziale blokada w wierszu 1.

  • Transakcja B nabywa udziale blokada w wierszu 2.

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

  • Teraz transakcji B żąda wyłączności blokada w wierszu 1 i jest bblokadaed dopóki transakcja A zakończy się i zwalnia udział blokada ma w pierwszym wierszu.

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ż określany jako zależność cykliczna: Transakcja A ma zależności w transakcji B, a transakcja B zamyka okręgu przez zależność dla transakcji A.

Obu transakcji w zakleszczenie będzie czekać zawsze, chyba że zakleszczenie jest dzielony przez proces zewnętrzny.The Microsoft SQL Server Database Engine deadlock monitor periodically checks for tasks that are in a deadlock.Jeśli monitor wykryje współzależności cyklicznej, pozwala wybrać jedno z zadań jako ofiarą i kończy transakcji z powodu błędu.Dzięki temu inne zadania do wykonania transakcji.Aplikacja z transakcji, które zakończone z powodu błędu można ponowić próbę wykonania transakcję, która zazwyczaj kończy się po zakończeniu deadlocked transakcji.

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

Deadlocking jest często mylić z normalnych blokowania.Gdy transakcja żąda blokada do zasób, zablokowany przez inną transakcję, żądającego transakcji czeka, aż zwolnieniu blokada.Domyślnie SQL Server transakcji do nie limitu czas, o ile jest LOCK_TIMEOUT zestaw. Żądanie transakcji jest zablokowany, nie jest zakleszczony, ponieważ żądającego transakcja nie została wykonana niczego do blokada transakcji posiadającego blokadę.Ostatecznie posiadanie transakcji spowoduje zakończenie i Zwolnij blokada, a następnie zostanie udzielony żądającego transakcji blokada i kontynuować pracę.

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

Zakleszczenie jest to stan, który może wystąpić w systemie z wielu wątków, nie tylko na system zarządzania relacyjnymi bazami danych i mogą być zasoby inne niż blokad dla obiektów bazy danych.Na przykład wątek wielowątkowe systemu operacyjnego może pobrać jednego lub większej liczby zasobów, takich jak bloki pamięci.Jeśli inny wątek jest aktualnie właścicielem zasób, przejmowane, pierwszy wątku może być czekać na stronie wątku w celu zwolnienia zasób docelowego.Wątek oczekuje jest nazywany jest zależność na stronie wątku dla danego zasób.W wystąpieniu Database Engine, sesje mogą zakleszczenie po nabyciu nondatabase zasobów, takich jak pamięć lub wątków.

Diagram showing transaction deadlock

Na ilustracji, transakcja T1 ma zależność dla transakcji T2 dla Część blokada tabela zasobu.Podobnie, transakcja T2 ma zależności w transakcji T1 dla Dostawcy tabela blokada zasób.Ponieważ te zależności tworzą cyklu, brak zakleszczenie między transakcjami T1 i T2.

Zakleszczenia może również wystąpić, gdy tabela jest już podzielony na partycje i LOCK_ESCALATION zestaw ting instrukcji ALTER TABLE jest zestaw do AUTO.Gdy LOCK_ESCALATION AUTO, współbieżność zwiększa się o zezwolenie Database Engine Aby zablokować tabela partycji poziom HoBT zamiast poziom tabela. Jednak po osobne transakcje przechowywania w tabela partycji blokada i ma blokada gdzieś na innej partycji, transakcje, powoduje to zakleszczenie.Ten rodzaj zakleszczenie można uniknąć poprzez ustawienie LOCK_ESCALATION tabela; mimo to ustawienie zmniejszy współbieżność przez cały dużych aktualizacji do partycji oczekiwanie na blokadę tabela.