Sobes.tech
Middle

Aké úrovne izolácie transakcií v databázach poznáš?

sobes.tech AI

Odpoveď od AI

V štandardnej SQL sú definované štyri úrovne izolácie transakcií: Read Uncommitted, Read Committed, Repeatable Read, Serializable.

  1. Read Uncommitted: Najnižšia úroveň. Transakcia môže čítať údaje, ktoré ešte neboli potvrdené (t.j. vykonané inou transakciou, ktorá ešte nebola ukončená COMMIT). To vedie k "špinavým" čítaniam (dirty reads).

  2. Read Committed: Transakcia vidí iba údaje, ktoré boli potvrdené pred začiatkom alebo počas jej vykonávania. Zabraňuje "špinavým" čítaniam, ale umožňuje neustále čítania (non-repeatable reads) a fenomény (phantom reads).

    • Neustále čítania: To isté čítanie v rámci jednej transakcie vráti odlišné údaje, pretože iná transakcia medzičasom zmenila a potvrdila ich.
    • Fantomové čítania: Pri vykonávaní dotazu s podmienkou WHERE druhá transakcia pridá alebo odstráni riadky, ktoré zodpovedajú podmienke, a opakovanie toho istého dotazu v rámci prvej transakcie vráti odlišný súbor riadkov.
  3. Repeatable Read: Transakcia vidí iba údaje, ktoré boli potvrdené pred jej začiatkom. Zaručuje, že opakované čítania tých istých riadkov v rámci jednej transakcie vráti rovnaké údaje. Zabraňuje "špinavým" a neustále čítaniam. Umožňuje fenomény.

    // Príklad Repeatable Read
    // Transakcia 1
    // BEGIN TRANSACTION;
    // SELECT COUNT(*) FROM users WHERE status = 'active'; // Napríklad, 100
    
    // Transakcia 2 (beží súčasne)
    // BEGIN TRANSACTION;
    // INSERT INTO users (name, status) VALUES ('Nový používateľ', 'active');
    // COMMIT;
    
    // Transakcia 1
    // SELECT COUNT(*) FROM users WHERE status = 'active'; // Ešte stále 100 (fenomén)
    // COMMIT;
    
  4. Serializable: Najvyššia úroveň izolácie. Zaručuje, že paralelné vykonávanie transakcií bude ekvivalentné určitým sekvenčným vykonávaniam týchto transakcií. Zabraňuje "špinavým" čítaniam, neustále čítaniam a fenoménom. Môže viesť k zníženiu výkonu kvôli blokovaniu.

V rôznych systémoch správy databáz môžu byť svoje implementácie a špecifiká úrovní izolácie, ako aj ďalšie úrovne. Napríklad v MySQL InnoDB je predvolená úroveň Repeatable Read.