Głębiej
Poziom izolacji określa, jak Twoja transakcja zachowuje się, gdy inne transakcje równolegle czytają/zapisują te same dane. To kompromis poprawność ↔ współbieżność.
Typowe anomalie:
- **Dirty read**: odczyt niezacommitowanych danych.
- **Non-repeatable read**: dwa odczyty tego samego wiersza dają inne wartości.
- **Phantom read**: ponowne wykonanie zapytania zakresowego zwraca inny zestaw wierszy.
Typowe poziomy izolacji (koncepcyjnie):
- `READ UNCOMMITTED` (dopuszcza dirty reads)
- `READ COMMITTED` (bez dirty reads, możliwe non-repeatable/phantoms)
- `REPEATABLE READ` (mocniejsze, zależy od DB/MVCC)
- `SERIALIZABLE` (najmocniejsze, ale może abortować transakcje przy konfliktach)
Praktyka
- Zacznij od domyślnego poziomu (często `READ COMMITTED`) i podnoś izolację tylko tam, gdzie jest to potrzebne.
- Przy `SERIALIZABLE` przygotuj retry (serialization failures są normalne przy kontencji).
Typowe pułapki
- Założenie, że identyczna izolacja działa tak samo w każdej bazie (implementacje się różnią).
- Długie transakcje + wysoka izolacja = więcej blokad/abortów.
- „Leczenie” race condition tylko przez izolację zamiast przez constraints i poprawne wzorce lockowania.