Izolacja (systemy baz danych) - Isolation (database systems)

W systemach baz danych izolacja określa, w jaki sposób integralność transakcji jest widoczna dla innych użytkowników i systemów.

Niższy poziom izolacji zwiększa zdolność wielu użytkowników do uzyskiwania dostępu do tych samych danych w tym samym czasie, ale zwiększa liczbę efektów współbieżności (takich jak brudne odczyty lub utracone aktualizacje), które mogą napotkać użytkownicy. I odwrotnie, wyższy poziom izolacji zmniejsza rodzaje efektów współbieżności, które mogą napotkać użytkownicy, ale wymaga więcej zasobów systemowych i zwiększa szanse, że jedna transakcja zablokuje inną.

Izolacja jest zwykle definiowana na poziomie bazy danych jako właściwość, która definiuje, w jaki sposób lub kiedy zmiany wprowadzone przez jedną operację stają się widoczne dla innych. W starszych systemach może być wdrażana systemowo, na przykład za pomocą tabel tymczasowych. W systemach dwuwarstwowych do utrzymania izolacji wymagany jest menedżer przetwarzania transakcji (TP). W systemach n-tier (takich jak wiele stron internetowych próbujących zarezerwować ostatnie miejsce na lot) do zatwierdzenia rezerwacji i wysłania potwierdzenia do klienta wymagana jest kombinacja procedur przechowywanych i zarządzania transakcjami.

Izolacja jest jedną z czterech właściwości KWASU , obok atomowości , konsystencji i trwałości .

Nadzór konkurencji

Kontrola współbieżności obejmuje podstawowe mechanizmy w DBMS, które obsługują izolację i gwarantują związaną z tym poprawność. Jest intensywnie wykorzystywany przez silniki bazodanowe i magazynujące zarówno w celu zagwarantowania poprawnego wykonywania współbieżnych transakcji, jak i (poprzez różne mechanizmy) poprawności innych procesów DBMS. Mechanizmy związane z transakcjami zazwyczaj ograniczają czas operacji dostępu do danych bazy danych ( harmonogramy transakcji ) do pewnych zleceń scharakteryzowanych jako właściwości harmonogramu serializacji i odtwarzania . Ograniczenie wykonywania operacji dostępu do bazy danych zazwyczaj oznacza zmniejszoną wydajność (mierzoną szybkością wykonywania), a zatem mechanizmy kontroli współbieżności są zazwyczaj projektowane tak, aby zapewnić najlepszą możliwą wydajność w ramach ograniczeń. Często, gdy jest to możliwe bez szkody dla poprawności, właściwość serializowalności jest zagrożona w celu uzyskania lepszej wydajności. Jednak możliwości odzyskiwania nie mogą być zagrożone, ponieważ zwykle prowadzi to do szybkiego naruszenia integralności bazy danych .

Blokowanie dwufazowe jest najczęstszą metodą kontroli współbieżności transakcji w DBMS, używaną do zapewnienia zarówno serializacji, jak i możliwości odzyskania poprawności. Aby uzyskać dostęp do obiektu bazy danych, transakcja musi najpierw uzyskać blokadę dla tego obiektu. W zależności od typu operacji dostępu (np. odczyt lub zapis obiektu) oraz typu blokady, uzyskanie blokady może zostać zablokowane i odroczone, jeśli inna transakcja utrzymuje blokadę dla tego obiektu.

Przeczytaj zjawiska

Standard ANSI/ISO SQL 92 odnosi się do trzech różnych zjawisk odczytu, gdy Transakcja 1 odczytuje dane, które Transakcja 2 mogła ulec zmianie.

W poniższych przykładach mają miejsce dwie transakcje. W pierwszym wykonywane jest Zapytanie 1. Następnie w drugiej transakcji wykonywane jest i zatwierdzane zapytanie 2. Na koniec w pierwszej transakcji Zapytanie 1 jest wykonywane ponownie.

Zapytania wykorzystują następującą tabelę danych:

użytkownicy
ID Nazwa wiek
1 Joe 20
2 Jill 25

Brudne odczyty

Odczytu brudny (aka uncommitted zależność ) występuje wtedy, gdy transakcja jest możliwość odczytu danych z wiersza, który został zmodyfikowany przez inną transakcję uruchomiony i jeszcze nie popełnione.

Brudne odczyty działają podobnie do odczytów niepowtarzalnych ; jednak druga transakcja nie musiałaby zostać zatwierdzona, aby pierwsze zapytanie zwróciło inny wynik. Jedyną rzeczą, której można zapobiec na poziomie izolacji READ UNCOMMITTED, są aktualizacje pojawiające się w nieprawidłowej kolejności w wynikach; oznacza to, że wcześniejsze aktualizacje będą zawsze wyświetlane w zestawie wyników przed późniejszymi aktualizacjami.

W naszym przykładzie transakcja 2 zmienia wiersz, ale nie zatwierdza zmian. Transakcja 1 następnie odczytuje niezatwierdzone dane. Teraz, jeśli Transakcja 2 cofa swoje zmiany (już odczytane przez Transakcję 1) lub aktualizuje różne zmiany w bazie danych, to widok danych może być błędny w rekordach Transakcji 1.

Transakcja 1 Transakcja 2
/* Query 1 */
SELECT age FROM users WHERE id = 1;
/* will read 20 */
/* Query 2 */
UPDATE users SET age = 21 WHERE id = 1;
/* No commit here */
/* Query 1 */
SELECT age FROM users WHERE id = 1;
/* will read 21 */
ROLLBACK; /* lock-based DIRTY READ */

Ale w tym przypadku nie istnieje wiersz, który ma identyfikator 1 i wiek 21.

Niepowtarzalne odczyty

Powtarzalny odczyt odbywa się, gdy w trakcie transakcji, wiersz jest pobierane dwukrotnie, a wartości w wierszu różnić między odczytuje.

Zjawisko niepowtarzalnych odczytów może wystąpić w metodzie kontroli współbieżności opartej na blokadach, gdy blokady odczytu nie są nabywane podczas wykonywania operacji SELECT lub gdy nabyte blokady w wierszach, których dotyczy problem, są zwalniane zaraz po wykonaniu operacji SELECT. W metodzie wielowersyjnej kontroli współbieżności odczyty niepowtarzalne mogą wystąpić, gdy wymóg wycofania transakcji dotkniętej konfliktem zatwierdzania zostanie złagodzony.

Transakcja 1 Transakcja 2
/* Query 1 */
SELECT * FROM users WHERE id = 1;
/* Query 2 */
UPDATE users SET age = 21 WHERE id = 1;
COMMIT; /* in multiversion concurrency
   control, or lock-based READ COMMITTED */
/* Query 1 */
SELECT * FROM users WHERE id = 1;
COMMIT; /* lock-based REPEATABLE READ */

W tym przykładzie transakcja 2 zostaje pomyślnie zatwierdzona, co oznacza, że ​​jej zmiany w wierszu o identyfikatorze 1 powinny stać się widoczne. Jednak Transakcja 1 widziała już inną wartość wieku w tym wierszu. Na poziomach izolacji SERIALIZABLE i REPEATABLE READ DBMS musi zwrócić starą wartość dla drugiego SELECT. Przy READ COMMITTED i READ UNCOMMITTED SZBD może zwrócić zaktualizowaną wartość; jest to niepowtarzalna lektura.

Istnieją dwie podstawowe strategie stosowane w celu zapobiegania niepowtarzalnym odczytom. Pierwszym z nich jest opóźnienie wykonania Transakcji 2 do momentu zatwierdzenia lub wycofania Transakcji 1. Ta metoda jest używana, gdy używane jest blokowanie i tworzy harmonogram szeregowy T1, T2 . Harmonogram seryjny wykazuje powtarzalne zachowanie odczytów .

W drugiej strategii, używanej w wielowersyjnej kontroli współbieżności , Transakcja 2 może najpierw dokonać zatwierdzenia, co zapewnia lepszą współbieżność. Jednak Transakcja 1, która rozpoczęła się przed Transakcją 2, musi nadal działać na wcześniejszej wersji bazy danych — migawka momentu, w którym została uruchomiona. Kiedy Transakcja 1 w końcu próbuje zatwierdzić, SZBD sprawdza, czy wynik zatwierdzenia Transakcji 1 byłby równoważny z harmonogramem T1, T2 . Jeśli tak, Transakcja 1 może być kontynuowana. Jeśli jednak nie można uznać, że jest równoważny, Transakcja 1 musi wycofać się z niepowodzeniem serializacji.

Korzystając z metody kontroli współbieżności opartej na blokowaniu, w trybie izolacji ODCZYT POWTARZALNY wiersz o identyfikatorze = 1 zostanie zablokowany, blokując w ten sposób zapytanie 2 do momentu zatwierdzenia lub wycofania pierwszej transakcji. W trybie READ COMMITTED przy drugim wykonaniu Zapytania 1 wiek uległby zmianie.

Pod kontrolą współbieżności wielu wersji, na poziomie izolacji SERIALIZABLE, oba zapytania SELECT widzą migawkę bazy danych zrobioną na początku transakcji 1. Dlatego zwracają te same dane. Jeśli jednak transakcja 2 spróbuje również zaktualizować ten wiersz, wystąpi błąd serializacji i transakcja 1 zostanie zmuszona do wycofania.

Na poziomie izolacji READ COMMITTED każde zapytanie zawiera migawkę bazy danych wykonaną na początku każdego zapytania. Dlatego każdy z nich widzi inne dane dla zaktualizowanego wiersza. W tym trybie nie jest możliwe niepowodzenie serializacji (ponieważ nie ma żadnej obietnicy serializacji), a Transakcja 1 nie będzie musiała być ponawiana.

Upiór czyta

Do odczytu fantomowego dochodzi, gdy w trakcie transakcji do odczytywanych rekordów dodawane są nowe wiersze lub usuwane przez inną transakcję.

Może się to zdarzyć, gdy blokady zakresu nie są uzyskiwane podczas wykonywania operacji SELECT ... WHERE . Phantom czyta anomalia jest szczególnym przypadkiem jednorazowych czyta gdy transakcja 1 powtarza wahała SELECT ... WHERE zapytań oraz pomiędzy obu operacji, transakcja 2 tworzy (tj INSERT ) (nowe wiersze w tabeli docelowej), które spełniają że GDZIE klauzula.

Transakcja 1 Transakcja 2
/* Query 1 */
SELECT * FROM users
WHERE age BETWEEN 10 AND 30;
/* Query 2 */
INSERT INTO users(id, name, age) VALUES (3, 'Bob', 27);
COMMIT;
/* Query 1 */
SELECT * FROM users
WHERE age BETWEEN 10 AND 30;
COMMIT;

Zauważ, że Transakcja 1 dwukrotnie wykonała to samo zapytanie. Jeśli został zachowany najwyższy poziom izolacji, ten sam zestaw wierszy powinien zostać zwrócony za każdym razem, i rzeczywiście jest to wymagane w bazie danych działającej na poziomie izolacji SQL SERIALIZABLE. Jednak na niższych poziomach izolacji inny zestaw wierszy może zostać zwrócony po raz drugi.

W trybie izolacji SERIALIZABLE Zapytanie 1 spowodowałoby zablokowanie wszystkich rekordów z przedziałem wiekowym od 10 do 30, a zatem Zapytanie 2 zostałoby zablokowane do momentu zatwierdzenia pierwszej transakcji. W trybie REPEATABLE READ zakres nie zostałby zablokowany, co pozwoliłoby na wstawienie rekordu. Dlatego druga instrukcja Zapytania 1 nie zwróci tego samego wyniku, co pierwsza.

Poziomy izolacji

Spośród czterech właściwości ACID w DBMS (systemie zarządzania bazą danych), właściwość izolacji jest najczęściej złagodzona. Podczas próby utrzymania najwyższego poziomu izolacji DBMS zwykle blokuje dane, co może skutkować utratą współbieżności lub implementuje kontrolę współbieżności wielu wersji . Wymaga to dodania logiki, aby aplikacja działała poprawnie.

Większość DBMS oferuje szereg poziomów izolacji transakcji , które kontrolują stopień blokowania, który występuje podczas wybierania danych. W przypadku wielu aplikacji bazodanowych większość transakcji bazodanowych można skonstruować tak, aby uniknąć wysokich poziomów izolacji (np. poziom SERIALIZABLE), zmniejszając w ten sposób obciążenie systemu związane z blokowaniem. Programista musi dokładnie przeanalizować kod dostępu do bazy danych, aby upewnić się, że jakiekolwiek rozluźnienie izolacji nie spowoduje trudnych do znalezienia błędów oprogramowania. I odwrotnie, jeśli używane są wyższe poziomy izolacji, zwiększa się możliwość zakleszczenia , co również wymaga starannej analizy i technik programowania, aby uniknąć.

Ponieważ każdy poziom izolacji jest silniejszy niż te poniżej, w tym sensie, że żaden wyższy poziom izolacji nie pozwala na działanie zabronione przez niższy, standard pozwala DBMS na uruchomienie transakcji na poziomie izolacji silniejszym niż żądany (np. "Odczyt zatwierdzony" transakcja może być faktycznie wykonana na poziomie izolacji „Powtarzalny odczyt”).

Poziomy izolacji zdefiniowane przez standard ANSI / ISO SQL są wymienione poniżej.

Możliwość serializacji

To najwyższy poziom izolacji.

W przypadku implementacji DBMS opartej na blokadach kontroli współbieżności , możliwość serializacji wymaga zwolnienia blokad odczytu i zapisu (nabytych na wybranych danych) po zakończeniu transakcji. Również blokady zakresu muszą być uzyskane, gdy zapytanie SELECT używa klauzuli WHERE z zakresem , szczególnie w celu uniknięcia zjawiska odczytów fantomowych .

W przypadku korzystania z kontroli współbieżności bez blokady nie są uzyskiwane żadne blokady; jeśli jednak system wykryje kolizję zapisu między kilkoma współbieżnymi transakcjami, tylko jedna z nich może zostać zatwierdzona. Zobacz izolację migawki, aby uzyskać więcej informacji na ten temat.

Od: (Drugi nieformalny projekt przeglądowy) ISO/IEC 9075:1992, Język bazy danych SQL — 30 lipca 1992: Gwarantuje się, że wykonywanie jednoczesnych transakcji SQL na poziomie izolacji SERIALIZABLE jest możliwe do serializacji. Wykonanie możliwe do serializacji jest zdefiniowane jako wykonanie operacji współbieżnego wykonywania transakcji SQL, które daje taki sam efekt, jak niektóre seryjne wykonanie tych samych transakcji SQL. Wykonywanie szeregowe to takie, w którym każda transakcja SQL jest wykonywana do końca przed rozpoczęciem następnej transakcji SQL.

Powtarzalne odczyty

Na tym poziomie izolacji implementacja DBMS oparta na blokadach kontroli współbieżności utrzymuje blokady odczytu i zapisu (nabyte na wybranych danych) aż do zakończenia transakcji. Jednak blokady zakresu nie są zarządzane, więc mogą wystąpić odczyty fantomowe .

Pochylenie zapisu jest możliwe na tym poziomie izolacji w niektórych systemach. Pochylenie zapisu to zjawisko, w którym dwa zapisy są dozwolone w tej samej kolumnie (kolumnach) w tabeli przez dwóch różnych autorów (którzy wcześniej czytali kolumny, które aktualizują), w wyniku czego kolumna zawiera dane będące mieszanką dwóch transakcji .

Przeczytaj zobowiązanie

Na tym poziomie izolacji implementacja DBMS oparta na blokadach kontroli współbieżności utrzymuje blokady zapisu (nabyte na wybranych danych) do końca transakcji, ale blokady odczytu są zwalniane natychmiast po wykonaniu operacji SELECT (więc zjawisko niepowtarzalnych odczytów może wystąpić na tym poziomie izolacji). Podobnie jak na poprzednim poziomie, blokady zasięgu nie są zarządzane.

Mówiąc prościej, read commit to poziom izolacji, który gwarantuje, że wszystkie odczytane dane są zatwierdzane w momencie ich odczytu. Po prostu ogranicza czytelnikowi możliwość zobaczenia jakichkolwiek pośrednich, niezaangażowanych, „brudnych” przeczytanych tekstów. Nie daje żadnej obietnicy, że jeśli transakcja ponownie wyda odczyt, znajdzie te same dane; dane mogą ulec zmianie po ich odczytaniu.

Przeczytaj bez zobowiązań

To najniższy poziom izolacji. Na tym poziomie dozwolone są nieprawidłowe odczyty , więc jedna transakcja może zobaczyć niezatwierdzone jeszcze zmiany wprowadzone przez inne transakcje.

Domyślny poziom izolacji

Domyślny poziom izolacji różnych DBMS „s różni się dość znacznie. Większość baz danych zawierających transakcje pozwala użytkownikowi ustawić dowolny poziom izolacji. Niektóre DBMS wymagają również dodatkowej składni podczas wykonywania instrukcji SELECT w celu uzyskania blokad (np. SELECT ... FOR UPDATE w celu uzyskania wyłącznych blokad zapisu w dostępnych wierszach).

Jednak powyższe definicje zostały skrytykowane jako niejednoznaczne i niedokładnie odzwierciedlające izolację zapewnianą przez wiele baz danych:

Ten artykuł pokazuje szereg słabości w podejściu anomalii do definiowania poziomów izolacji. Te trzy zjawiska ANSI są niejednoznaczne i nawet w swoich najluźniejszych interpretacjach nie wykluczają pewnych anomalii… Prowadzi to do pewnych sprzecznych z intuicją wyników. W szczególności poziomy izolacji oparte na blokadach mają inne cechy niż ich odpowiedniki ANSI. Jest to niepokojące, ponieważ komercyjne systemy baz danych zazwyczaj wykorzystują implementacje blokujące. Dodatkowo, zjawiska ANSI nie rozróżniają wielu typów zachowań na poziomie izolacji, które są popularne w systemach komercyjnych.

Istnieją również inne krytyki dotyczące definicji izolacji ANSI SQL, ponieważ zachęca ona implementatorów do robienia „złych rzeczy”:

... opiera się w subtelny sposób na założeniu, że schemat blokowania jest używany do kontroli współbieżności, w przeciwieństwie do optymistycznego lub wielowersyjnego schematu współbieżności. Oznacza to, że proponowana semantyka jest źle zdefiniowana .

Poziomy izolacji, zjawiska odczytu i blokady

Poziomy izolacji a zjawiska odczytu

„+” — możliwe
„-” — niemożliwe”


             Przeczytaj zjawiska


Poziom izolacji

Brudne odczyty Utracone aktualizacje Niepowtarzalne odczyty Upiory
Przeczytaj bez zobowiązań + + + +
Przeczytaj Zatwierdzone - + + +
Powtarzalny odczyt - - - +
Możliwość serializacji - - - -

Anomalia Serializable to nie to samo co Serializable. Oznacza to, że jest to konieczne, ale niewystarczające, aby harmonogram serializowalny był wolny od wszystkich trzech typów zjawisk.

Zobacz też

Bibliografia

Linki zewnętrzne