Cześć wszystkim. Vladislav Rodin jest w kontakcie. Obecnie jestem kierownikiem kursu High Workload Architect w firmie OTUS, a także prowadzę kursy z zakresu architektury oprogramowania.
Oprócz nauczania, jak być może zauważyłeś, piszę autorskie materiały na blog OTUS na Habré i chcę, aby dzisiejszy artykuł zbiegł się z uruchomieniem kursu
Wprowadzenie
В
Izolacja
Izolacja rozwiązuje problem dostępu do danych w konkurencyjnym środowisku, zasadniczo zapewniając ochronę przed warunkami wyścigowymi. W idealnym przypadku izolacja oznacza serializację, która jest właściwością zapewniającą, że wynik równoległego wykonywania transakcji będzie taki sam, jak gdyby były wykonywane sekwencyjnie. Głównym problemem związanym z tą właściwością jest to, że jest ona bardzo trudna do zapewnienia pod względem technicznym i w rezultacie ma znaczący wpływ na wydajność systemu. Dlatego izolacja jest często osłabiana, akceptując ryzyko pewnych anomalii, które zostaną omówione poniżej. Możliwość wystąpienia określonych anomalii precyzyjnie charakteryzuje poziom izolacji transakcji.
Najbardziej znane anomalie to: brudny odczyt, niepowtarzalny odczyt, fantomowy odczyt, ale w rzeczywistości jest ich jeszcze 5: brudny zapis, utrata aktualizacji kursora, utracona aktualizacja, odczytanie przekrzywienia, przekrzywienie zapisu.
Brudny zapis
Istotą anomalii jest to, że transakcje mogą nadpisać niezatwierdzone dane.
Ta anomalia jest niebezpieczna nie tylko dlatego, że dane mogą powodować konflikt po zatwierdzeniu obu transakcji (jak na obrazku), ale także dlatego, że naruszona jest atomowość: ponieważ pozwalamy na nadpisywanie niezatwierdzonych danych, nie jest jasne, jak wycofać jedną transakcję bez wpływu na inną .
Anomalię można potraktować w prosty sposób: przed rozpoczęciem rejestracji zakładamy blokadę rekordu, uniemożliwiając innym transakcjom zmianę rekordu do czasu zdjęcia blokady.
Brudna lektura
Brudny odczyt oznacza odczyt niezatwierdzonych danych.
Problemy pojawiają się, gdy trzeba podjąć działania lub decyzje na podstawie próbki.
Aby skorygować anomalię, możesz dołączyć blokadę odczytu, ale będzie to miało duży wpływ na wydajność. Dużo prościej jest powiedzieć, że w przypadku transakcji typu rollback konieczne jest zapisanie w systemie stanu początkowego danych (przed rozpoczęciem rejestracji). Dlaczego nie przeczytać stamtąd? Jest na tyle niedrogi, że większość baz danych domyślnie usuwa brudny odczyt.
Utracona aktualizacja
Utracona aktualizacja oznacza utracone aktualizacje, a tłumaczenie dość trafnie oddaje istotę problemu:
W rzeczywistości wynik transakcji T2 został odwrócony. Sytuację tę można skorygować poprzez jawne lub ukryte blokady zapisu. Oznacza to, że albo po prostu aktualizujemy rekord, a następnie następuje niejawna blokada, albo wykonujemy to wybierz aktualizację, powodując blokadę odczytu i zapisu. Należy pamiętać, że taka operacja jest dość niebezpieczna: naszym „niewinnym” czytaniem blokujemy inne odczyty. Niektóre bazy danych oferują większe bezpieczeństwo wybierz do udostępnienia, umożliwiając odczyt danych, ale bez modyfikowania.
Kursor utracił aktualizację
Aby zapewnić lepszą kontrolę, bazy mogą oferować inne narzędzia, takie jak kursor. Kursor to struktura zawierająca zestaw wierszy i umożliwiająca iterację po nich. zadeklaruj nazwę_kursora dla instrukcji wyboru. Zawartość kursora jest opisana poprzez wybór.
Dlaczego potrzebujesz kursora? Faktem jest, że niektóre bazy danych oferują blokadę wszystkich rekordów wybranych przez selekcję (stabilność odczytu) lub tylko rekordu, na którym aktualnie znajduje się kursor (stabilność kursora). Przy stabilności kursora zaimplementowano krótką blokadę, co pozwala nam zmniejszyć liczbę blokad w przypadku iteracji po dużej próbce danych. Dlatego anomalia utraconej aktualizacji jest izolowana oddzielnie dla kursora.
Niepowtarzalny odczyt
Odczyt niepowtarzalny polega na tym, że podczas realizacji naszej transakcji 2 kolejne odczyty tego samego rekordu doprowadzą do różnych wyników, ponieważ pomiędzy tymi dwoma odczytami wkroczyła inna transakcja, zmieniła nasze dane i została zatwierdzona.
Dlaczego jest to w ogóle problem? Wyobraź sobie, że celem transakcji T2 na obrazku jest wybranie wszystkich towarów, których cena jest niższa niż 150 USD. Ktoś inny podniósł cenę do 200 dolarów. Dlatego zainstalowany filtr nie działał.
Anomalie te przestają występować po dodaniu blokad dwufazowych lub zastosowaniu mechanizmu MVCC, o czym chciałbym osobno porozmawiać.
Czytanie fantomowe
Phantom to odczyt danych, które zostały dodane przez inną transakcję.
Jako przykład możemy zaobserwować nieprawidłowy wybór najtańszego produktu w przypadku wystąpienia tej anomalii.
Pozbycie się odczytów fantomowych jest już dość trudne. Regularne blokowanie nie wystarczy, ponieważ nie możemy zablokować czegoś, czego jeszcze nie ma. Systemy 2PL korzystają z blokowania predykcyjnego, podczas gdy systemy MVCC posiadają harmonogram transakcji, który wycofuje transakcje, które mogą zostać zakłócone przez wstawienie. Zarówno pierwszy, jak i drugi mechanizm są dość ciężkie.
Przeczytaj przekrzywienie
Skośność odczytu ma miejsce, gdy pracujemy z kilkoma tabelami, których zawartość musi się stale zmieniać.
Załóżmy, że mamy tabele reprezentujące posty i ich metainformacje:
Jedna transakcja odczytuje z tabel, druga je modyfikuje:
W wyniku transakcji T1 post ma tytuł = Good i update_by = T2, co jest pewnego rodzaju niespójnością.
W rzeczywistości jest to odczyt jednorazowy, ale jako część kilku tabel.
Aby temu zaradzić, T1 może zablokować wszystkie wiersze, które odczyta, co zapobiegnie zmianie informacji przez transakcję T2. W przypadku MVCC transakcja T2 zostanie anulowana. Ochrona przed tą anomalią może stać się istotna, jeśli będziemy używać kursorów.
Napisz przekrzywienie
Tę anomalię łatwiej też wytłumaczyć na przykładzie: załóżmy, że w naszym systemie co najmniej jeden lekarz powinien pełnić dyżur, ale obaj lekarze zdecydowali się odwołać dyżur:
Anomalia oznaczała, że żaden z lekarzy nie będzie na dyżurze. Dlaczego się to stało? Ponieważ transakcja sprawdzała warunek, który mogłaby naruszyć inna transakcja, a ze względu na izolację nie zaobserwowaliśmy tej zmiany.
To jest ten sam, niepowtarzalny odczyt. Alternatywnie wybrani mogą nakładać blokady na te rekordy.
Skos zapisu i odczytu są kombinacją poprzednich anomalii. Możesz rozważyć skośność zapisu, która jest zasadniczo odczytem fantomowym. Rozważmy tabelę zawierającą nazwiska pracowników, ich pensje i projekt, nad którym pracują:
W rezultacie otrzymujemy następujący obraz: każdy menedżer myślał, że jego zmiana nie doprowadzi do przekroczenia budżetu, więc dokonał zmian personalnych, które łącznie doprowadziły do przekroczenia kosztów.
Przyczyna problemu jest dokładnie taka sama jak w przypadku odczytu fantomowego.
odkrycia
Złagodzenie poziomu izolacji transakcji w bazie danych jest kompromisem pomiędzy bezpieczeństwem a wydajnością; do wyboru tego poziomu należy podejść w oparciu o potencjalne ryzyko dla firmy w przypadku wystąpienia pewnych anomalii.
Źródło: www.habr.com