Lekcje modułu (4/4)
Poziomy izolacji
Poza wyraźnym FOR UPDATE, transakcje mają również wrodzone reguły matematyczne wbudowane głęboko w silnik, które regulują, ile energii należy wydać, domyślnie izolując każdą indywidualną interakcję. Nazywa się to poziomem izolacji. W świecie SQL znamy 4 standardowe, według mocy i bezpieczeństwa, ale oczywiście odwrotnie, jeśli chodzi o wydajność.
READ UNCOMMITTED:Anarchiczne szaleństwo, w Twojej transakcji zostaną uwzględnione wszystkie zmiany dokonane przez innych, w tym tymczasowe dane od osób w połowie realizacji własnych skryptów. Nikt nie używa go na dużych bazach danych z powodu ciągłych błędów Dirty Read.READ COMMITTED:(domyślny dla Postgres). Natychmiast zobaczysz nowe dane, gdy tylko strona trzecia wyda polecenie COMMIT, ale możesz paść ofiarą odczytów fantomowych (wyświetlanie nowych rekordów w połowie długich przepływów pracy) lub nieliniowego, spójnego widoku.REPEATABLE READ:Cięższy. Na czas trwania twojej sesji z dużym oknem czasowym „widzę” bazę danych zawieszoną w momencie rozpoczęcia mojego zapytania, całkowicie ignorując i lekceważąc nawet oficjalne zatwierdzenia dokonane przez inne osoby! Chroni przed magicznie pojawiającymi się zapisami, gwarantując stabilność.- Poziom Boga
SERIALIZABLE:(bardzo powolny). Traktuje każdą nakładającą się transakcję, blokując je i wykonując szeregowo w jednej linii, bezlitośnie przerywając te, które kolidują, eliminując u podstaw nawet naukową możliwość najmniejszej kolizji, poświęcając solidne 90% wysokiej przepustowości.
Jak to ustawić?
Zamiast normalnego BEGIN; wpisujesz:
BEGIN ISOLATION LEVEL SERIALIZABLE;
-- and you proceed normally with your hermetically sealed isolation
UPDATE products SET stock = 10;
COMMIT;Lub w niektórych wariantach i starszych silnikach przypisujesz go po uruchomieniu:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;Spróbuj sam
Rozpocznij transakcję formalnie ustawiając poziom globalny na czas życia zapytania na REPEATABLE READ, aby utworzyć zamrożoną, chronioną wymianę. Pamiętaj, że na poziomie zapytania nie ma to żadnego sensu, chyba że nastąpi po nim coś innego, więc zamknij ją pustą za pomocą „COMMIT”.
Pokaż wskazówkę
Otwórz za pomocą BEGIN ISOLATION LEVEL REPEATABLE READ; i zamknij za pomocą COMMIT;
Rozwiązanie dostępne po 3 próbach
Wypróbujmy szalony poziom serializacji i wstaw trochę fikcyjnych danych. Otwórz blok „SERIALIZABLE”. Zaktualizuj nazwę kategorii Id=2 do „Nuovo Nome Segreto”. Uruchom ostatnie atomowe, zatwierdzające zatwierdzenie.
Pokaż wskazówkę
ROZPOCZNIJ POZIOM IZOLACJI SERIALIZOWALNY; AKTUALIZACJA kategorii SET name = 'Nuovo Nome Segreto' WHERE id = 2; COMMIT;
Rozwiązanie dostępne po 3 próbach