Ce niveluri de izolare a tranzacțiilor în bazele de date cunoști?
sobes.tech AI
Răspuns de la AI
Standardul SQL definește patru niveluri de izolare a tranzacțiilor: Read Uncommitted, Read Committed, Repeatable Read, Serializable.
-
Read Uncommitted: Cel mai de jos nivel. O tranzacție poate citi date care nu au fost încă confirmate (adică, efectuate de o altă tranzacție care nu s-a încheiat încă cu
COMMIT). Aceasta duce la citiri "murdare" (dirty reads). -
Read Committed: Tranzacția vede doar datele care au fost confirmate înainte sau în timpul execuției sale. Previne citirile "murdare", dar permite citiri nerepetabile (non-repeatable reads) și fantome (phantom reads).
- Citiri nerepetabile: Aceeași citire în cadrul unei tranzacții poate returna date diferite deoarece o altă tranzacție le-a modificat și confirmat între timp.
- Fantome: La executarea unei interogări cu condiția
WHERE, o altă tranzacție adaugă sau elimină rânduri care corespund condiției, iar executarea aceleiași interogări în cadrul primei tranzacții returnează un set diferit de rânduri.
-
Repeatable Read: Tranzacția vede doar datele care au fost confirmate înainte de începerea sa. Garantează că citirile repetate ale acelorași rânduri în cadrul unei tranzacții vor returna aceleași date. Previne citirile "murdare" și nerepetabile. Permite fantome.
// Exemplu de Repeatable Read // Tranzacția 1 // BEGIN TRANSACTION; // SELECT COUNT(*) FROM users WHERE status = 'active'; // De exemplu, 100 // Tranzacția 2 (executată simultan) // BEGIN TRANSACTION; // INSERT INTO users (name, status) VALUES ('Utilizator nou', 'active'); // COMMIT; // Tranzacția 1 // SELECT COUNT(*) FROM users WHERE status = 'active'; // În continuare 100 (fantom) // COMMIT; -
Serializable: Cel mai înalt nivel de izolare. Garantează că execuția paralelă a tranzacțiilor va fi echivalentă cu o execuție secvențială a acestor tranzacții. Previne citirile "murdare", nerepetabile și fantome. Poate duce la scăderea performanței din cauza blocărilor.
În diferite SGBD-uri, pot exista implementări și caracteristici proprii ale nivelurilor de izolare, precum și niveluri suplimentare. De exemplu, în MySQL InnoDB, nivelul implicit este Repeatable Read.