0Pricing
Coding Interview Prep · Lekcja

Cztery poziomy izolacji

Od Read Uncommitted do Serializable oraz zakres operacji dozwolonych przez każdy poziom.

Cztery poziomy izolacji to bezpłatna lekcja Coding Interview Prep na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Coding Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.

Pytanie kryjące się za pytaniem

Gdy rekruter pyta "wymień cztery poziomy izolacji", tak naprawdę sprawdza, czy potrafią Państwo wyjaśnić kompromis: silniejsza izolacja oznacza mniej anomalii, ale mniejszą współbieżność.

Standard SQL definiuje cztery poziomy, uporządkowane od najsłabszego do najsilniejszego:

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

Każdy poziom dopuszcza lub blokuje określony zestaw anomalii odczytu. Ta lekcja omawia poziomy, a następna szczegółowo omawia anomalie.

Ustawianie poziomu izolacji

Poziom izolacji ustawia się dla każdej transakcji albo sesji. Składnia jest niemal identyczna w różnych silnikach.

Jeśli nie zostanie ustawiony, każda baza danych ma poziom domyślny. Znajomość wartości domyślnych jest częstym pytaniem na rozmowach kwalifikacyjnych, dlatego omówimy je na końcu.

-- Per transaction (standard SQL)
BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- ... statements ...
COMMIT;

-- Per session
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

Poziom 1: READ UNCOMMITTED

READ UNCOMMITTED to najsłabszy poziom. Transakcja może odczytywać wiersze zmodyfikowane przez inną transakcję, ale jeszcze przez nią niezatwierdzone. Nazywa się je brudnymi odczytami.

Jeśli tamta transakcja wycofa zmiany, odczytane zostały dane, które formalnie nigdy nie istniały. Jest to niebezpieczne w przypadku wszystkiego, co musi być poprawne.

Uwaga: Postgres traktuje READ UNCOMMITTED tak samo jak READ COMMITTED, więc w rzeczywistości nigdy nie wykonuje brudnych odczytów. SQL Server i MySQL respektują ten poziom.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN;
-- may see another transaction's uncommitted (dirty) rows
SELECT balance FROM accounts WHERE id = 1;
COMMIT;

Poziom 2: READ COMMITTED

READ COMMITTED gwarantuje, że odczytywane są wyłącznie dane, które zostały zatwierdzone. Brak brudnych odczytów.

Każda instrukcja widzi jednak najnowszy zatwierdzony migawkowy obraz danych. Jeśli to samo zapytanie zostanie wykonane dwukrotnie w ramach jednej transakcji, inna zatwierdzona transakcja wykonana w międzyczasie może zmienić wynik. Ta anomalia to odczyt niepowtarzalny.

Jest to poziom domyślny w Postgres, Oracle i SQL Server oraz rozsądny kompromis dla większości aplikacji.

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN;
SELECT balance FROM accounts WHERE id = 1;  -- returns 500
-- another transaction commits an update to id = 1
SELECT balance FROM accounts WHERE id = 1;  -- may now return 700
COMMIT;

Poziom 3: REPEATABLE READ

REPEATABLE READ zapewnia, że jeśli ten sam wiersz zostanie odczytany dwukrotnie w ramach jednej transakcji, za każdym razem otrzyma się tę samą wartość. Na początku transakcji tworzona jest spójna migawka danych.

Poziom ten zapobiega brudnym i niepowtarzalnym odczytom. Standard nadal dopuszcza odczyty fantomowe: nowe wiersze pasujące do klauzuli WHERE, które pojawią się przy ponownym wykonaniu zapytania.

Ważne: jest to poziom domyślny w MySQL/InnoDB, a implementacja InnoDB blokuje również większość odczytów fantomowych za pomocą blokad next-key.

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
SELECT balance FROM accounts WHERE id = 1;  -- 500
-- another transaction commits a change to id = 1
SELECT balance FROM accounts WHERE id = 1;  -- still 500 in this txn
COMMIT;

Poziom 4: SERIALIZABLE

SERIALIZABLE to najbardziej restrykcyjny poziom. Baza danych gwarantuje, że wynik współbieżnego wykonania transakcji będzie identyczny z wynikiem wykonania ich jedna po drugiej w pewnej kolejności szeregowej.

Poziom ten zapobiega brudnym i niepowtarzalnym odczytom oraz odczytom fantomowym. Ceną jest więcej blokad albo, w Postgres, przerywanie transakcji z powodu błędu serializacji, co wymaga ich ponowienia.

Sformułowanie na rozmowę kwalifikacyjną: "SERIALIZABLE daje złudzenie, że każda transakcja wykonała się samodzielnie, kosztem mniejszej współbieżności i możliwych ponowień."

BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT SUM(balance) FROM accounts;
INSERT INTO audit (total) VALUES (...);
COMMIT;  -- may raise a serialization_failure you retry

Macierz anomalii

Najbardziej przydatną rzeczą do zapamiętania jest informacja, którą anomalię dopuszcza każdy poziom. "Tak" oznacza, że anomalia może wystąpić.

  • READ UNCOMMITTED: brudne=Tak, niepowtarzalne=Tak, fantomowe=Tak
  • READ COMMITTED: brudne=Nie, niepowtarzalne=Tak, fantomowe=Tak
  • REPEATABLE READ: brudne=Nie, niepowtarzalne=Nie, fantomowe=Tak (zgodnie ze standardem)
  • SERIALIZABLE: brudne=Nie, niepowtarzalne=Nie, fantomowe=Nie

Każdy kolejny poziom eliminuje możliwość wystąpienia jednej dodatkowej anomalii. Na tym polega cała odpowiedź.

Standard a rzeczywiste implementacje

Rozróżnienie na poziomie seniora: standard SQL definiuje poziomy według anomalii, którym muszą zapobiegać, a nie sposobu realizacji. Rzeczywiste silniki często zapobiegają większej liczbie anomalii.

  • Postgres REPEATABLE READ używa izolacji opartej na migawkach i również blokuje odczyty fantomowe, choć nadal może wystąpić write skew.
  • MySQL/InnoDB REPEATABLE READ blokuje odczyty fantomowe za pomocą blokad next-key.
  • Postgres SERIALIZABLE używa SSI (Serializable Snapshot Isolation), przerywając transakcję w razie konfliktu zamiast stosować intensywne blokowanie.

Wspomnienie o tym pokazuje, że standard jest minimalnym wymaganiem, a nie dokładnym opisem zachowania silnika.

Domyślne poziomy w zależności od silnika

Domyślne poziomy są bardzo często poruszane. Warto je zapamiętać:

  • PostgreSQL: READ COMMITTED
  • Oracle: READ COMMITTED (brudne odczyty nigdy nie występują)
  • SQL Server: READ COMMITTED
  • MySQL (InnoDB): REPEATABLE READ

Wyjątek dotyczący MySQL to ulubiona pułapka rekruterów. Jeśli padnie pytanie "jaki jest domyślny poziom izolacji?", należy najpierw ustalić, o jaki silnik chodzi.

Wybór poziomu w praktyce

Jak podjąć decyzję? Należy ująć ją jako kompromis między ryzykiem a przepustowością.

  • W typowych systemach OLTP należy używać READ COMMITTED; jest szybki i eliminuje brudne odczyty.
  • Po REPEATABLE READ należy sięgać, gdy transakcja wielokrotnie odczytuje te same dane i muszą one pozostać niezmienne (raporty, obliczenia wieloetapowe).
  • SERIALIZABLE należy stosować w przypadku logiki, dla której poprawność ma kluczowe znaczenie i żadna anomalia nie jest dopuszczalna, projektując jednocześnie mechanizm ponawiania po przerwaniu transakcji.

W środowisku produkcyjnym READ UNCOMMITTED należy stosować prawie nigdy.

Częste pytania dodatkowe

Po wymienieniu poziomów rekruterzy zadają szybkie pytania dodatkowe. Warto przygotować zwięzłe odpowiedzi:

  • "Który poziom zapobiega brudnym odczytom, ale dopuszcza odczyty niepowtarzalne?" READ COMMITTED.
  • "Jaką jedyną anomalię REPEATABLE READ nadal dopuszcza według standardu?" Odczyty fantomowe.
  • "Dlaczego nie używać zawsze SERIALIZABLE?" Zmniejsza współbieżność i może wymuszać ponawianie transakcji po błędach serializacji.
  • "Czy wyższy poziom kosztuje więcej?" Tak, w postaci kosztu blokad albo przerywania i ponawiania transakcji.

Natychmiastowe udzielenie tych odpowiedzi dowodzi, że hierarchia poziomów została zrozumiana, a nie tylko zapamiętana.

Szybki test

Jedna z tych informacji o domyślnym poziomie jest szczególnie często sprawdzana.

Podsumowanie: cztery poziomy, jeden kompromis

Cztery poziomy izolacji tworzą drabinę od najsłabszego do najsilniejszego: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE. Każdy wyższy poziom eliminuje możliwość wystąpienia jednej dodatkowej anomalii (brudnych, niepowtarzalnych i fantomowych odczytów), kosztem współbieżności.

Należy pamiętać o poziomach domyślnych (READ COMMITTED wszędzie poza REPEATABLE READ w MySQL) oraz o tym, że rzeczywiste silniki często zapobiegają większej liczbie anomalii, niż wymaga standard. Następnie przyjrzymy się trzem anomaliom odczytu, którym te poziomy mają zapobiegać.

Często zadawane pytania

Czy lekcja „Cztery poziomy izolacji” jest bezpłatna?

Tak — pełny tekst „Cztery poziomy izolacji” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Coding Interview Prep, przejdź na CoddyKit PRO. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.

Co nauczysz się w „Cztery poziomy izolacji”?

Od Read Uncommitted do Serializable oraz zakres operacji dozwolonych przez każdy poziom. Ćwiczysz Coding Interview Prep z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Coding Interview Prep?

Nie wymagamy żadnego doświadczenia. Coding Interview Prep w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Cztery poziomy izolacji”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Coding Interview Prep?

Tak. Każda lekcja Coding Interview Prep zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Wyjaśnienie właściwości ACID
  2. Cztery poziomy izolacji
  3. Odczyty brudne, niepowtarzalne i fantomowe
  4. Zakleszczenia, blokady i MVCC
← Powrót do Coding Interview Prep