Sobes.tech
Middle

Jakie poziomy izolacji transakcji w bazach danych znasz?

sobes.tech AI

Odpowiedź od AI

W standardzie SQL zdefiniowano cztery poziomy izolacji transakcji: Read Uncommitted, Read Committed, Repeatable Read, Serializable.

  1. Read Uncommitted: Najniższy poziom. Transakcja może czytać dane, które jeszcze nie zostały zatwierdzone (czyli wykonane przez inną transakcję, która jeszcze nie zakończyła się COMMIT). Prowadzi to do "brudnych" odczytów (dirty reads).

  2. Read Committed: Transakcja widzi tylko dane, które zostały zatwierdzone przed lub w trakcie jej wykonania. Zapobiega "brudnym" odczytom, ale pozwala na odczyty niepowtarzalne (non-repeatable reads) i odczyty fantomowe (phantom reads).

    • Odczyty niepowtarzalne: Ten sam odczyt w ramach jednej transakcji może zwrócić różne dane, ponieważ inna transakcja je zmieniła i zatwierdziła.
    • Odczyty fantomowe: Podczas wykonywania zapytania z warunkiem WHERE, inna transakcja dodaje lub usuwa wiersze spełniające warunek, a ponowne wykonanie tego samego zapytania w ramach pierwszej transakcji zwraca inny zestaw wierszy.
  3. Repeatable Read: Transakcja widzi tylko dane, które zostały zatwierdzone przed jej rozpoczęciem. Gwarantuje, że powtarzające się odczyty tych samych wierszy w ramach jednej transakcji zwrócą te same dane. Zapobiega "brudnym" i odczytom niepowtarzalnym. Pozwala na odczyty fantomowe.

    // Przykład Repeatable Read
    // Transakcja 1
    // BEGIN TRANSACTION;
    // SELECT COUNT(*) FROM users WHERE status = 'active'; // Na przykład, 100
    
    // Transakcja 2 (wykonywana równocześnie)
    // BEGIN TRANSACTION;
    // INSERT INTO users (name, status) VALUES ('Nowy użytkownik', 'active');
    // COMMIT;
    
    // Transakcja 1
    // SELECT COUNT(*) FROM users WHERE status = 'active'; // Nadal 100 (fantom)
    // COMMIT;
    
  4. Serializable: Najwyższy poziom izolacji. Gwarantuje, że równoległe wykonywanie transakcji będzie równoważne pewnemu ich wykonaniu sekwencyjnemu. Zapobiega "brudnym" odczytom, odczytom niepowtarzalnym i odczytom fantomowym. Może obniżać wydajność z powodu blokad.

W różnych systemach zarządzania bazami danych (DBMS) mogą istnieć własne implementacje i cechy poziomów izolacji, a także dodatkowe poziomy. Na przykład w MySQL InnoDB domyślnym poziomem jest Repeatable Read.