eskalacja blokad (aparat bazy danych)

eskalacja blokad jest procesem konwertowania liczbę blokad ziarna kary na mniejszą liczbę blokad grubą ziarna, zmniejszenie systemu obciążenie podczas zwiększa prawdopodobieństwo rywalizacji współbieżność.

Jak SQL Server Database Engine uzyskuje blokady niskiego poziom, również umieszcza blokad konwersji obiektów, które zawierają obiekty niższego poziom:

  • Podczas blokada wierszy lub indeks klucz zakresów, Database Engine umieszcza blokada zamierzona na stronach, które zawierają wiersze lub klucze.

  • Podczas blokada stron, Database Engine umieszcza blokada zamierzona na wyższy poziom obiektów, które zawierają stron. Oprócz blokada zamierzona na obiekt wymagane są blokad konwersji strona na następujące obiekty:

    • Strony poziom liść ponownego zbudowania indeksów nie klastrowanych

    • Stosowanie indeksów klastrowanych stron do danych

    • Strony danych sterty.

The Database Engine might do both row and strona blokadaing for the same instrukcja to minimize the number of blokadas and reduce the likelihood that eskalacja blokad will be necessary. Na przykład Database Engine można umieścić strona blokuje na indeks nieklastrowany (jeśli jest za mało sąsiadujących ze sobą klucze w węźle indeksu są wybierane w celu zaspokojenia kwerendy) i blokowanie wierszy danych.

Aby przekazać zgłoszenie blokady, Database Engine próby, aby zmienić opcje zablokować w tabela, aby odpowiadające im pełną blokady, na przykład zmiana konwersji wyłącznej blokady (IX) blokada wyłączności (X) lub intencji współużytkowany blokady (IS) udostępnionego blokady (S)). Jeśli powiedzie się próba zablokowania eskalacji i pełny blokada tabela został nabyty, a następnie wszystkie sterty B-drzewo, strona (PAGE) lub poziomie wiersza (RID) blokada przechowywane przez transakcję w stosie lub indeks są zwalniane.Jeśli nie można pobrać pełnego blokada, nie eskalacji blokada się stanie, na które czas oraz Database Engine będzie pobrać wiersz, klucz lub blokad strona.

The Database Engine does not escalate row or klucz-zakres locks to strona locks, but escalates them directly to tabela locks. Podobnie blokady stron są zawsze przekazany do tabela blokad.W SQL Server 2008, blokowanie tabel podzielonym na partycje można przekazać zgłoszenie do poziom HoBT skojarzone partycji zamiast na blokadę tabela. Blokada HoBT poziom nie blokuje musi być wyrównany HoBTs dla partycji.

Uwaga

Poziom HoBT blokad zwykle zwiększyć współbieżność, ale wprowadzenie potencjał zakleszczenia, transakcji, które są blokowania na różnych partycjach zaznaczyć rozwinąć ich wyłącznej blokady do innych partycji.W rzadkich przypadkach ziarnistość blokowania tabela mogą działać lepiej.

Jeśli próba eskalacji do blokada kończy się niepowodzeniem z powodu konfliktu blokada przechowywane przez jednoczesne transakcje Database Engine będzie ponawiać eskalacji blokada dla każdego dodatkowego blokad 1,250 nabytych przez transakcję.

Każde zdarzenie eskalacji działa przede wszystkim poziom pojedynczego Transact-SQL Instrukcja. Po uruchomieniu zdarzenie, Database Engine próby przekazać zgłoszenie wszystkie blokady należących do bieżącej transakcji w każdym z tabel, które mają już odwołuje się instrukcja akcji pod warunkiem, że spełnia wymagania eskalacji progu. Jeśli zdarzenie eskalacji rozpoczyna się w instrukcja ma uzyskać dostęp do tabela, nie jest podejmowana próba przekazać zgłoszenie blokad w tej tabela.Jeśli eskalacja blokad zakończy się pomyślnie, wszystkie blokada nabytych przez transakcję w poprzednim instrukcja i nadal przechowywane w momencie uruchamiania zdarzenie będzie być przekazany tabela odwołują się do bieżącej instrukcja i znajduje się w przypadku eskalacji.

Na przykład załóżmy, że sesja wykonuje następujące operacje:

  • Rozpoczęcie transakcji.

  • Aktualizacje TableA.Spowoduje to wygenerowanie blokad wyłączne wiersza w TableA są przechowywane do zakończenia transakcji.

  • Aktualizacje TableB.Spowoduje to wygenerowanie blokad wyłączne wiersza w TableB są przechowywane do zakończenia transakcji.

  • Wykonuje SELECT, która łączy TableA with TableC.Plan wykonania kwerend wymaga wierszy, które mają być pobierane z TableA przed pobraniem wierszy z TableC.

  • Wyzwalacze instrukcja SELECT eskalacja blokad w czasie, gdy jest ona pobieranie wierszy z TableA i ma uzyskać dostęp do TableC.

Jeśli eskalacja blokad powiedzie się, tylko blokada utrzymywane przez sesja na TableA są przekazany.Dotyczy to zarówno udostępnionego blokad dla instrukcji SELECT, jak i wyłącznej blokady z poprzedniego instrukcja UPDATE.Podczas tylko blokad sesja uzyskane w TableA dla instrukcja SELECT są uwzględniane w celu określenia, czy eskalacja blokad powinno być wykonane, po pomyślnym eskalacji wszystkie blokada utrzymywane przez sesja w TableA są przekazany do blokada na wyłączność w tabela, a wszystkie inne ziarnistość dolnym blokada, w tym celu blokada, na TableA są zwalniane.

Nie jest podejmowana próba przekazać zgłoszenie blokad na TableB powodu aktywnej odwołań do TableB w instrukcja SELECT.Podobnie nie jest podejmowana próba przekazać zgłoszenie blokad na TableC, które nie są przekazany, ponieważ jego miał nie jeszcze uzyskany dostęp do po wystąpieniu eskalacji.

eskalacja blokad Wartości progowe

eskalacja blokad zostanie wywołany podczas eskalacja blokad nie jest wyłączona w tabela przy użyciu instrukcji ALTER tabela zestaw LOCK_ESCALATION opcji i istnieje jeden z następujących warunków:

  • Pojedyncze Transact-SQL Instrukcja pobrania, co najmniej 5000 blokad dla pojedynczej tabela nonpartitioned lub indeksu.

  • Pojedyncze Transact-SQL Instrukcja pobrania, co najmniej 5000 blokad dla jednej partycji tabela partycjonowana, a ustawiona opcja instrukcji ALTER TABLE zestaw LOCK_ESCALATION AUTO.

  • Liczba blokad w wystąpieniu Database Engine przekracza progów pamięci lub konfiguracja.

Jeśli blokada nie może być przekazany ze względu na konflikty blokada Database Engine okresowo wyzwala eskalacja blokad na każdy 1,250 blokad nowego nabycia.

Próg eskalacji instrukcja języka Transact-SQL

eskalacja blokad jest wyzwalane, gdy Transact-SQL Instrukcja pobrania, co najmniej 5000 blokad dla odwołanie pojedynczej tabeli lub indeksie, lub jeśli tabela jest podzielony na partycje, pojedyncze odniesienia partycji tabeli lub partycji indeksu. Na przykład eskalacja blokad nie zostanie wywołany, jeśli w instrukcja pobrania 3000 blokad w jeden indeks i blokowaniem 3000 innego indeksu w tej samej tabela.Podobnie eskalacja blokad nie zostanie wywołany, jeśli oświadczenie ma autosprzężenie w tabela, a każde odwołanie do tabela uzyskuje tylko 3000 blokad w tabela.

eskalacja blokad występuje tylko dla tabel, otwartej w momencie wyzwolenia eskalacji.Zakładać, że pojedynczej instrukcja SELECT jest łączyć, łączący się z trzech tabel w tej kolejności: TableA, TableB, and TableC.W instrukcja pobrania 3000 blokad wierszy w indeksie klastrowanym dla TableA i co najmniej 5000 blokady wierszy w indeksie klastrowanym dla TableB, ale nie zostało jeszcze dostępu do TableC.Gdy Database Engine wykrywa, że w instrukcja uzyskał co najmniej 5000 blokad wiersza w TableB, podejmowana jest próba przekazać zgłoszenie wszystkie blokady przechowywane przez bieżącej transakcji na TableB.Ponadto próbuje przekazać zgłoszenie wszystkie blokady przechowywane przez bieżącej transakcji na TableA, ale ponieważ liczbę blokad dla TableA < 5000, eskalacji nie powiedzie się. Nie eskalacja blokad podejmowana jest próba dla TableC ponieważ on miał nie jeszcze uzyskany dostęp do po wystąpieniu eskalacji.

Próg eskalacji w przypadku wystąpienie aparat bazy danych

Za każdym razem, gdy liczba blokad jest większy niż próg pamięci dla eskalacji blokada Database Engine Wyzwalacze zablokować eskalacji. Próg pamięci zależy od ustawień blokady opcji konfiguracja:

  • Jeśli blokada opcja jest zestaw do jego domyślnego zestaw ting 0, następnie progu eskalacja blokad zostanie osiągnięty po 40 procent pamięci używanej przez jest używany przez obiekty blokada pamięciDatabase Engine, z wyjątkiem AWE pamięci. Struktura danych, używany do reprezentowania blokada jest około 100 bajtów.Ten próg jest dynamiczny ponieważ Database Engine dynamicznie uzyskuje i zwalnia pamięci, aby dopasować różne obciążenia pracą.

  • Jeśli blokada opcja jest na wartość inną niż 0, a następnie progu eskalacja blokad wynosi 40 procent (lub mniej if jest ciśnienia pamięci) wartości opcji blokad.

The Database Engine can choose any instrukcja akcji from any sesja for escalation, and for every 1,250 new locks it will choose statements for escalation as long as the blokada memory used in the wystąpienie remains above the threshold.

Escalating mieszanych typów blokada

W przypadku wystąpienia eskalacja blokad blokada, wybranych do stosu lub indeksu jest wystarczająco mocne, aby spełnić wymagania najbardziej restrykcyjne niższy poziom blokady.

Załóżmy na przykład sesja:

  • Rozpoczęcie transakcji.

  • Aktualizuje tabela zawierającą indeks klastrowany.

  • Wystawia instrukcja SELECT, która odwołuje się do tej samej tabela.

Instrukcja UPDATE pobrania tych blokad:

  • Blokuje wyłączności (X) w wierszach zaktualizowane dane.

  • Blokuje konwersji wyłączności (IX) na stronach indeks klastrowany zawierające te wiersze.

  • Blokada IX z indeks klastrowany i innej tabela.

Instrukcja SELECT uzyskuje te blokady:

  • Udostępnione (S) blokada s na wszystkich danych wierszy go odczytów, chyba że wiersz jest już chroniony x blokada z instrukcja UPDATE.

  • blokada udostępnienie zamierzone na wszystkich stronach indeks klastrowany zawierające wiersze, jeśli strona nie jest już chroniony przez blokowanie IX.

  • Nie blokada klastrowanego indeksu lub w tabela, ponieważ są już chronione przez IX blokad.

Jeśli instrukcja SELECT uzyskuje wystarczająco dużo blokada do wyzwalania eskalacji eskalacja blokad zakończy się pomyślnie, IX blokadę w tabela jest konwertowany na blokada X i wszystkich wierszy, strona i blokad indeksu są zwalniane.Aktualizacje oraz operacje odczytu są chronione przez X blokadę w tabela.

Blokowanie degresywnej i eskalacji

W większości przypadków Database Engine zapewnia najlepszą wydajność podczas pracy z domyślne ustawienia blokowania i eskalacja blokad. Jeśli wystąpienie Database Engine generuje dużą ilość blokada i jest oglądanie za częste blokada, należy wziąć pod uwagę zmniejszenie ilości blokowanie przez:

  • Za pomocą możliwy poziom izolacji, które nie generuje udostępniony blokad dla operacji odczytu.

    • Poziom izolacji odczytu POPEŁNIONYCH podczas READ_COMMITTED_SNAPSHOT opcji bazy danych jest włączone.

    • Poziom izolacji migawka.

    • Poziom izolacji NIEPRZYDZIELONYCH odczytu.Ta opcja może służyć tylko w przypadku systemów, które mogą działać z odczytów zabrudzony.

Uwaga

Zmiana poziom izolacji wpływa na wszystkie tabele w wystąpieniu Database Engine.

  • Za pomocą PAGLOCK lub TABLOCK tabela wskazówki mają Database Engine Użyj strona, stosu lub blokad indeksu zamiast blokad wiersza. Jednak przy użyciu tej opcji zwiększa problemów blokowania innych użytkowników próbujących uzyskać dostęp do tych samych danych użytkowników i nie powinny być używane w systemach z więcej niż kilku równoczesnych użytkowników.

  • W przypadku tabel podzielonym na partycje za pomocą opcji LOCK_ESCALATION ALTER tabelaprzekazać zgłoszenie blokada do poziom HoBT w tabela lub wyłączenie eskalacja blokad.

Flagi śledzenia 1211 i 1224 umożliwia również wyłączenie wszystkich lub niektórych za blokada.Aby uzyskać więcej informacji zobaczFlagi śledzenia (Transact-SQL).Ponadto eskalacji blokada monitora przy użyciu SQL Server Profiler Patrz i blokada: eskalacji zdarzeń; Using SQL Server Profiler.