Lekcja teoretyczna: Poziom izolacji transakcji – Repeatable Read
Repeatable Read to poziom izolacji transakcji, który zapewnia, że wszystkie odczyty danych w ramach jednej transakcji są spójne. Oznacza to, że jeśli transakcja odczytuje te same dane wielokrotnie, zawsze otrzyma ten sam wynik, nawet jeśli inne transakcje dokonują zmian na tych danych i je zatwierdzają. Jednak poziom ten nie chroni przed zjawiskiem odczytów widmowych (phantom reads).
1. Czym jest poziom izolacji Repeatable Read?
Poziom izolacji Repeatable Read pozwala na powtarzalne odczyty danych w ramach jednej transakcji. Transakcja „widzi” dane w stanie, w jakim były one na początku transakcji, niezależnie od zmian zatwierdzanych przez inne transakcje. Eliminuje to zjawisko non-repeatable reads, ale wciąż może występować phantom reads, gdzie różne odczyty w tej samej transakcji mogą zwracać różną liczbę wierszy, jeśli inne transakcje dodają nowe dane pasujące do kryteriów zapytania.
Przykład sytuacji:
- Transakcja A odczytuje listę produktów z tabeli (np. 10 produktów).
- Transakcja B dodaje nowy produkt i zatwierdza transakcję.
- Transakcja A ponownie odczytuje tę samą tabelę i nadal widzi 10 produktów, ale przy odczycie większej ilości danych może zobaczyć dodatkowe wiersze (tzw. odczyty widmowe).
2. Zjawiska występujące w poziomie Repeatable Read
Poziom izolacji Repeatable Read eliminuje:
- Brudne odczyty (dirty reads): Dane odczytywane są tylko po zatwierdzeniu zmian przez inne transakcje.
- Niepowtarzalne odczyty (non-repeatable reads): Wyniki odczytu tej samej wartości nie zmieniają się w trakcie trwania transakcji.
Ograniczenia:
- Odczyty widmowe (phantom reads): Możliwe jest, że kolejne zapytania SELECT w tej samej transakcji zwrócą różną liczbę wierszy, jeśli inne transakcje dodają lub usuwają dane pasujące do zapytania.
3. Zalety i wady poziomu Repeatable Read
Zalety:
- Spójność odczytów: Dane odczytane wielokrotnie przez tę samą transakcję zawsze pozostaną spójne.
- Brak niepowtarzalnych odczytów: Odczyty w ramach jednej transakcji są zawsze takie same.
Wady:
- Odczyty widmowe: Nie chroni przed sytuacjami, w których liczba wierszy w wynikach zapytania zmienia się w trakcie transakcji.
4. Przykład zastosowania Repeatable Read
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT * FROM produkty WHERE cena > 100;
-- Transakcja A widzi zawsze ten sam zestaw produktów, niezależnie od nowych zatwierdzonych zmian.
COMMIT;
Lekcja teoretyczna: Poziom izolacji transakcji – Serializable
Serializable to najwyższy poziom izolacji transakcji w MySQL, który zapewnia pełną izolację transakcji. W tym trybie transakcje są wykonywane w sposób seryjny, co eliminuje wszystkie niepożądane zjawiska, takie jak dirty reads, non-repeatable reads oraz phantom reads. Jest to najbezpieczniejszy, ale zarazem najwolniejszy poziom izolacji, który może wpływać na wydajność bazy danych.
1. Czym jest poziom izolacji Serializable?
Poziom Serializable wymusza na transakcjach działanie w sposób, jakby były wykonywane jedna po drugiej (seryjnie), nawet jeśli w rzeczywistości są wykonywane równolegle. Oznacza to, że baza danych zapewnia pełną spójność odczytów i eliminuje zjawiska odczytów widmowych.
Przykład sytuacji:
- Transakcja A odczytuje listę zamówień.
- Transakcja B próbuje dodać nowe zamówienie w tym samym czasie.
- Transakcja B musi poczekać na zakończenie Transakcji A, aby uniknąć konfliktu.
2. Zjawiska eliminowane przez poziom Serializable
Poziom Serializable eliminuje:
- Brudne odczyty (dirty reads)
- Niepowtarzalne odczyty (non-repeatable reads)
- Odczyty widmowe (phantom reads)
3. Zalety i wady poziomu Serializable
Zalety:
- Pełna spójność danych: Zapewnia najwyższy poziom izolacji i spójności.
- Brak wszystkich niepożądanych zjawisk: Ochrona przed brudnymi odczytami, niepowtarzalnymi odczytami oraz odczytami widmowymi.
Wady:
- Wydajność: Znaczne spowolnienie operacji w systemie, szczególnie przy dużej liczbie równoległych transakcji.
- Zwiększona blokada zasobów: Może prowadzić do blokad i konfliktów, co zmniejsza wydajność przy dużym obciążeniu.
4. Przykład zastosowania Serializable
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
START TRANSACTION;
SELECT * FROM zamowienia WHERE status = 'otwarte';
-- Transakcja działa, jakby była wykonywana w pełnej izolacji od innych.
COMMIT;
Podsumowanie: Poziom Serializable to rozwiązanie dla systemów, w których pełna spójność danych jest priorytetem, nawet kosztem wydajności. Wybierając ten poziom izolacji, należy jednak liczyć się z możliwością wystąpienia blokad i spadkiem wydajności w sytuacjach intensywnego współbieżnego dostępu do bazy danych.