Poziomy izolacji: READ COMMITTED, REPEATABLE READ, SERIALIZABLE
Porównywać poziomy izolacji ze standardu SQL, ich implementację w PostgreSQL oraz wybierać właściwy poziom dla danego obciążenia
Poziomy izolacji: READ COMMITTED, REPEATABLE READ, SERIALIZABLE to bezpłatna lekcja SQL Academy 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 SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.
Cztery standardowe poziomy
Standard SQL definiuje cztery poziomy izolacji:
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE
PostgreSQL implementuje trzy z nich (READ UNCOMMITTED działa jak READ COMMITTED).
READ COMMITTED (domyślny w PostgreSQL)
Każda instrukcja widzi dane zatwierdzone przed jej rozpoczęciem. W ramach jednej transakcji mogą być widoczne różne migawki danych.
-- Inside one transaction:
SELECT balance FROM accounts WHERE id = 1; -- 100
-- meanwhile another tx commits balance=200
SELECT balance FROM accounts WHERE id = 1; -- 200 (non-repeatable read)REPEATABLE READ (izolacja oparta na migawce)
Widoczna jest migawka utworzona na początku transakcji. Ponowny odczyt tego samego wiersza zawsze zwraca tę samą wartość. REPEATABLE READ w PostgreSQL zapobiega również odczytom fantomowym.
BEGIN ISOLATION LEVEL REPEATABLE READ;
SELECT balance FROM accounts WHERE id = 1; -- 100
-- another tx commits balance=200
SELECT balance FROM accounts WHERE id = 1; -- still 100
COMMIT;SERIALIZABLE
Najsilniejszy poziom: transakcje zachowują się tak, jakby były wykonywane jedna po drugiej. PostgreSQL używa Serializable Snapshot Isolation (SSI) — wykrywa współbieżne zależności i przerywa konfliktujące transakcje:
BEGIN ISOLATION LEVEL SERIALIZABLE;
...
COMMIT;
-- ERROR: could not serialize access due to read/write dependenciesUstawianie poziomu izolacji
Dla pojedynczej transakcji, sesji albo globalnie:
-- Per transaction:
BEGIN ISOLATION LEVEL SERIALIZABLE;
-- Per session:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- Default for new transactions in this session:
SET default_transaction_isolation = 'repeatable read';
-- Global default in postgresql.conf:
-- default_transaction_isolation = 'read committed'Anomalie dopuszczalne na poszczególnych poziomach
| Poziom | Brudny | Niepowtarzalny | Fantomowy |
|---|---|---|---|
| READ UNCOMMITTED | może | może | może |
| READ COMMITTED | nie | może | może |
| REPEATABLE READ | nie | nie | nie (w PG) |
| SERIALIZABLE | nie | nie | nie |
Kompromisy wydajnościowe
- READ COMMITTED — minimalny narzut, poziom domyślny
- REPEATABLE READ — ten sam plan, spójność migawki, brak wpływu na wydajność, chyba że wystąpią konflikty zapisu
- SERIALIZABLE — dodatkowe śledzenie zależności, możliwość przerwania transakcji; aplikacja musi mieć mechanizm ponawiania prób
Wzorzec ponawiania dla SERIALIZABLE
SERIALIZABLE może przerwać transakcję z kodem 40001. Należy ponawiać próbę w pętli:
for (let i = 0; i < 3; i++) {
try {
await client.query('BEGIN ISOLATION LEVEL SERIALIZABLE');
// ... work ...
await client.query('COMMIT');
break;
} catch (e) {
if (e.code === '40001') continue;
throw e;
}
}Odczyt spójnej migawki
W przypadku długotrwałych zapytań analitycznych, które wymagają spójnych danych, REPEATABLE READ zapewnia właściwy kompromis.
Zachowanie w przypadku konfliktu zapisu
Jeśli dwie transakcje modyfikują ten sam wiersz:
- READ COMMITTED — druga transakcja czeka, następnie ponownie odczytuje nowy wiersz i próbuje ponownie
- REPEATABLE READ — druga transakcja zostaje przerwana z komunikatem „could not serialize” — aplikacja musi ponowić próbę
Wybór właściwego poziomu
Praktyczne zasady:
- OLTP — READ COMMITTED (domyślnie)
- Raporty wymagające spójności — REPEATABLE READ
- Pieniądze / zapasy — SERIALIZABLE + ponawianie prób LUB jawne blokady (FOR UPDATE)
Jawne blokady czasem lepsze niż izolacja
Często użycie SELECT ... FOR UPDATE przy READ COMMITTED jest prostsze niż SERIALIZABLE w przypadku pojedynczego często modyfikowanego wiersza.
Podsumowanie
Poziomy izolacji są kompromisem między bezpieczeństwem a współbieżnością.
- READ COMMITTED jest poziomem domyślnym
- REPEATABLE READ służy do spójnych odczytów
- SERIALIZABLE zapewnia działanie „tak jak szeregowe” — wymaga mechanizmu ponawiania prób
Szybkie sprawdzenie
Jaki jest domyślny poziom izolacji w PostgreSQL?
Często zadawane pytania
Czy lekcja „Poziomy izolacji: READ COMMITTED, REPEATABLE READ, SERIALIZABLE” jest bezpłatna?
Tak — pełny tekst „Poziomy izolacji: READ COMMITTED, REPEATABLE READ, SERIALIZABLE” 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 SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Poziomy izolacji: READ COMMITTED, REPEATABLE READ, SERIALIZABLE”?
Porównywać poziomy izolacji ze standardu SQL, ich implementację w PostgreSQL oraz wybierać właściwy poziom dla danego obciążenia Ćwiczysz SQL Academy 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ąć SQL Academy?
Nie wymagamy żadnego doświadczenia. SQL Academy 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 „Poziomy izolacji: READ COMMITTED, REPEATABLE READ, SERIALIZABLE”?
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 SQL Academy?
Tak. Każda lekcja SQL Academy 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
- Właściwości ACID i anomalie
- Poziomy izolacji: READ COMMITTED, REPEATABLE READ, SERIALIZABLE
- Zakleszczenia: wykrywanie i unikanie
- Blokowanie optymistyczne a pesymistyczne