Co to jest blokowanie i jak to się dzieje?


20

Próbowałem znaleźć pewne informacje na temat blokowania w SQL Server, ale nie mogłem znaleźć zwięzłego wyjaśnienia, co to jest i jak to się dzieje. Czy mógłbyś mnie oświecić?

Odpowiedzi:


23

Analogie

Czasami pomaga używać analogii z dala od komputerów.

Powiedzmy, że masz piłkę i dwoje dzieci. Tylko jedno dziecko może mieć piłkę jednocześnie. Jeśli jednak jedno z dzieci dostanie piłkę i nie puści jej, ponieważ jest rozproszone (na przykład ogląda telewizję), wówczas drugie dziecko nie będzie mogło bawić się piłką.

Drugie dziecko jest zablokowane z tego zasobu.

Jeśli porównamy to z telewizją, na przykład, kilkoro dzieci może oglądać telewizję w dowolnym momencie.

Zamki

Jeśli przejdziemy do świata baz danych, zauważymy, że istnieją różne sposoby korzystania z zasobów (podobnie jak nasze dwa powyższe przykłady). Możemy wykonywać „odczyty” lub „zapisywać”.

Kiedy chcemy odczytać dane, nie ma powodu, dla którego inni też nie mogą odczytać danych - tak jak dwie osoby oglądające telewizję. Jeśli jednak chcemy zapisać dane, musimy upewnić się, że nikt inny na nie nie patrzy. Jeśli czytają to, gdy my piszemy, otrzymają „brudne” odczyty. (Oznacza to, że zobaczą częściowo zapisane dane, które będą nieprawidłowe).

Aby mieć pewność, że te nieczytelne odczyty nigdy się nie zdarzają, mamy dwa podstawowe typy zamków, Blokady odczytu i Blokady wyłączne.

Czytaj Blokada

W danym momencie możesz mieć kilka różnych połączeń odczytujących z tego samego źródła danych. Aby jednak upewnić się, że nikt nie zmienia tych danych podczas ich odczytu, wyjmuje blokadę odczytu.

Gdy połączenie ma blokadę odczytu na danych, wszystkie inne połączenia muszą poczekać na zwolnienie blokady odczytu, zanim będą mogły zapisać dane. Inni mogą jednak usunąć własne blokady odczytu na tym samym fragmencie danych.

Blokada na wyłączność

Jeśli połączenie chce zaktualizować / wstawić / usunąć kawałek danych, musi wyjąć wyłączną blokadę. Zapobiega to również wyjmowaniu blokady danych przez inne połączenie (czyniąc blokadę wyłączną dla tego połączenia).

Gdy połączenie ma wyłączną blokadę danych, żadne inne połączenia nie mogą odczytać z danych. Pomaga to zapobiec nieczytelnym odczytom, zapewniając, że nikt nie może odczytać danych podczas ich zapisywania.

Bloking

„Blokowanie” to po prostu termin, który oznacza, że ​​jedno połączenie blokuje zasób, gdy inne połączenie chce go odczytać lub zapisać. Nie musi to oznaczać, że połączenie właściciela go nie zwolni, tylko że obecnie je utrzymuje.

Porównaj to z walizką z dzieckiem trzymającym piłkę. Dziecko trzymające piłkę blokuje wszystkie inne dzieci przed trzymaniem piłki.

Impas

Wiem, że o to nie pytałeś, ale to tylko jeden krok, aby dostać się do impasu (i jest to związane bezpośrednio z blokowaniem).

Zakleszczenia mogą się zdarzyć, gdy masz dwa połączenia, z których każde ma blokadę, ale nawzajem chcą zasobów. W tym scenariuszu jest jak dwoje dzieci, które mają piłkę, ale chcą piłki drugiej.

Podobnie jak dzieci, te połączenia w ogóle nie chcą się dzielić. Każde połączenie wymaga dostępu do obu zasobów, aby móc kontynuować. Są jednak w stanie stałego blokowania. W tym stanie rodzic (DBMS) musi wejść i wybrać przegranego, aby jedno z dzieci (połączeń) mogło uzyskać dostęp do obu zasobów.

Po nawiązaniu połączenia „zwalniającego” uwalnia zasoby, a następnie inne („tracące”) połączenie może spróbować ponownie uzyskać dostęp do obu zasobów.

Tak więc koncepcja impasu polega na tym, że masz dwa zasoby, które się wzajemnie blokują.


Tutaj możesz przeczytać więcej o wszystkich różnych typach zamków, które SQL Server ma do zaoferowania oraz o różnych zasobach, które mogą powodować blokowanie / zakleszczenia. Artykuł jest stary, ale nadal dotyczy SQL Server 2000 do 2008 R2. (Istnieje kilka innych rodzajów blokad dodanych do późniejszych wersji SQL Server, ale da to punkt wyjścia.)


1
@Richard, jak wspomniałeś, jeśli dojdzie do impasu, wtedy DBMS wejdzie i wybierze przegranego. Czy DBMS robi to automatycznie? A może źle zaprojektowany system (taki, który często doświadcza impasu) zatrzyma się, dopóki ktoś nie zainicjuje DBMS?
CenterOrbit

2
W przypadku SQL Server odbywa się to automatycznie (pod warunkiem, że baza danych wykryje zakleszczenie ). Może mieć problemy z wykryciem go, jeśli na przykład jest to faktycznie blokada na żywo .
Richard

Doskonała i bardzo dokładna odpowiedź Richard. Dodatkowy punkt na temat blokad aktywnych (których tak naprawdę nie należy porównywać ani związanych z zakleszczeniami, to po prostu stare blokowanie) ... SQL zapobiegnie dalszemu blokowaniu w przypadku oczekiwania blokady wyłącznej, IIRC po 4 kolejnych nakładających się blokadach wspólnych.
Mark Storey-Smith,

5

Świetne wyjaśnienie Richarda, ale chciałem tylko dodać linki do oficjalnej dokumentacji. Te tematy zostały napisane dla programu SQL Server 2000, ale większość koncepcji pozostała niezmieniona dzisiaj:

Zrozumienie i unikanie blokowania

Zrozumienie blokowania w SQL Server

Edycja - niektóre dodatki:

Wszystkie 3 są bardzo dobrze znanymi autorami SQL Server i / lub MVP.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.