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.
-
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). -
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
WHEREjiná 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ů.
-
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; -
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.