Sobes.tech
Middle

Jaké úrovně izolace transakcí v databázích znáš?

sobes.tech AI

Odpověď od AI

Ve standardu SQL jsou definovány čtyři úrovně izolace transakcí: Read Uncommitted, Read Committed, Repeatable Read, Serializable.

  1. Read Uncommitted: Nejnižší úroveň. Transakce může číst data, která ještě nebyla potvrzena (tj. provedena jinou transakcí, která ještě neskončila COMMIT). To vede k "špinavým" čtením (dirty reads).

  2. Read Committed: Transakce vidí pouze data, která byla potvrzena před nebo během jejího provádění. Zabraňuje "špinavým" čtením, ale umožňuje nevratná čtení (non-repeatable reads) a fantomy (phantom reads).

    • Neopakovatelná čtení: Stejné čtení v rámci jedné transakce může vrátit odlišná data, protože jiná transakce je změnila a potvrdila.
    • Fantomové čtení: Při provádění dotazu s podmínkou WHERE jiná transakce přidá nebo odstraní řádky odpovídající podmínce, a opakované provedení stejného dotazu v rámci první transakce vrátí jinou sadu řádků.
  3. Repeatable Read: Transakce vidí pouze data, která byla potvrzena před jejím začátkem. Zaručuje, že opakované čtení stejných řádků v rámci jedné transakce vrátí stejná data. Zabraňuje "špinavým" a nevratným čtením. Umožňuje fantomy.

    // Příklad Repeatable Read
    // Transakce 1
    // BEGIN TRANSACTION;
    // SELECT COUNT(*) FROM users WHERE status = 'active'; // Například 100
    
    // Transakce 2 (běží současně)
    // BEGIN TRANSACTION;
    // INSERT INTO users (name, status) VALUES ('Nový uživatel', 'active');
    // COMMIT;
    
    // Transakce 1
    // SELECT COUNT(*) FROM users WHERE status = 'active'; // Stále 100 (fantom)
    // COMMIT;
    
  4. Serializable: Nejvyšší úroveň izolace. Zaručuje, že paralelní provádění transakcí bude ekvivalentní nějakému sekvenčnímu provedení těchto transakcí. Zabraňuje "špinavým" čtením, nevratným čtením a fantomům. Může vést ke snížení výkonu kvůli zámkům.

V různých systémech správy databází (DBMS) mohou existovat vlastní implementace a vlastnosti úrovní izolace, stejně jako další úrovně. Například v MySQL InnoDB je výchozí úroveň Repeatable Read.