Poziomy izolacji kontrolują, jak bardzo konkurujące ze sobą transakcje mogą widzieć niezatwierdzone (lub w trakcie realizacji) zmiany — wymieniając spójność na wydajność/współbieżność. Wyższe izolowanie zapobiega więcej anomaliom, ale zwiększa blokowanie/rywalizację.
Anomalie współbieżności (co izolowanie zapobiega)
DIRTY READ → reading another transaction's UNCOMMITTED changes (which may roll back)
NON-REPEATABLE READ → re-reading a row gives different values (another txn UPDATED it)
PHANTOM READ → re-running a query returns different ROWS (another txn INSERTED/DELETED)
To są problemy, które mogą się pojawić, gdy transakcje działają równocześnie — poziomy izolacji kontrolują które z nich są zapobiegane.
Cztery standardowe poziomy izolacji
Level | Dirty Read | Non-repeatable | Phantom | Concurrency
──────────────────────────────────────────────────────────────────────
READ UNCOMMITTED | possible | possible | possible| highest (least safe)
READ COMMITTED | prevented | possible | possible| (common default)
REPEATABLE READ | prevented | prevented | possible|
SERIALIZABLE | prevented | prevented | prevented| lowest (most safe)
Każdy wyższy poziom zapobiega więcej anomaliom. Read Committed jest wspólnym domyślnym poziomem (zapobiega brudnym odczytom); Serializable jest najsurowszy (transakcje działają jak gdyby były wykonywane jeden na raz) ale najbardziej restrykcyjny dla współbieżności.
Ustawianie poziomu izolacji
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN;
-- ... operations run at the chosen isolation ...
COMMIT;
Fundamentalna wymiana
Higher isolation → MORE correctness (fewer anomalies), but MORE locking/contention
→ lower concurrency, potential slowdowns, more deadlocks
Lower isolation → MORE concurrency/performance, but risk of anomalies
→ Choose based on the data's needs: financial/critical data may need Serializable;
most apps use Read Committed (the default) as a balance.
→ Note: implementations vary (MVCC vs locking); the SQL standard defines the levels
but databases differ in details (Postgres, MySQL/InnoDB, etc.).
Dlaczego to ważne
Poziómy izolacji transakcji to ważna zaawansowana wiedza do zrozumienia współbieżności w bazach danych — gdy wiele transakcji działa jednocześnie (tak jak w każdej rzeczywistej aplikacji wieloużytkownika), poziomy izolacji określają wymianę między spójnością danych a wydajnością, więc zrozumienie ich jest cenne do budowania poprawnych, wydajnych aplikacji współbieżnych.
Koncepcje podstawowe to anomalie współbieżności (brudne odczyty, niepowtarzalne odczyty, fantomowe odczyty — problemy, które powstają gdy transakcje widzą zmiany w trakcie realizacji innych transakcji) i jak cztery poziomy izolacji (Read Uncommitted, Read Committed, Repeatable Read, Serializable) stopniowo zapobiegają więcej z nich.
Zrozumienie tego jest ważne dla poprawności: wybranie zbyt niskiego poziomu izolacji może pozwolić na anomalie, które uszkadzają dane lub produkują złe wyniki (np. odczyt niezatwierdzonego wariantu danych, który później się wycofuje, lub niespójne odczyty), zaś wybór zbyt wysokiego zmniejsza współbieżność i wydajność.
Fundamentalna wymiana — wyższa izolacja oznacza więcej poprawności, ale więcej blokowania/rywalizacji (mniejsza współbieżność, potencjalne spowolnienia i zakleszzczenia), niższa izolacja oznacza więcej wydajności, ale ryzyko anomalii — to jest główny wgląd: wybierasz poziom na podstawie wymagań spójności danych (krytyczne/finansowe dane mogą potrzebować Serializable; większość aplikacji używa Read Committed jako równowagi).
Wiedza, że implementacje się różnią (MVCC vs blokowanie) jest również istotna.
Ponieważ współbieżność jest nieodłączna w rzeczywistych aplikacjach bazodanowych, i ponieważ poziomy izolacji rządzą krytyczną równowagą między spójnością a wydajnością (błędne wybory powodując albo anomalie danych, albo problemy wydajności), zrozumienie poziomów izolacji — anomalii, poziomów i wymiany spójności-vs-współbieżności — to cenna wiedza na poziomie starszego inżyniera do budowania poprawnych, wydajnych systemów współbieżnych i częsty zaawansowany temat rozmowy o pracę, który demonstruje zrozumienie współbieżności baz danych.
