Sobes.tech
Middle

Kādus transakciju izolācijas līmeņus pazīsti datu bāzēs?

sobes.tech AI

Atbilde no AI

SQL standartā ir definēti četri izolācijas līmeņi transakcijām: Read Uncommitted, Read Committed, Repeatable Read, Serializable.

  1. Read Uncommitted: Zemākais līmenis. Transakcija var lasīt datus, kuri vēl nav apstiprināti (t.i., veikti ar citas transakcijas, kas vēl nav pabeigta COMMIT). Tas noved pie "netīriem" lasījumiem (dirty reads).

  2. Read Committed: Transakcija redz tikai tos datus, kas ir apstiprināti pirms tās sākuma vai tās laikā. Novērš "netīrus" lasījumus, bet ļauj neatkārtojamus lasījumus (non-repeatable reads) un fenomenu (phantom reads).

    • Neatkārtojami lasījumi: Tas pats lasījums vienā transakcijā atgriež dažādus datus, jo cita transakcija starp tiem ir mainījusi un apstiprinājusi datus.
    • Fenomeni: Kad vaicājums ar WHERE nosacījumu tiek veikts, otra transakcija pievieno vai dzēš rindas, kas atbilst nosacījumam, un atkārtots tā paša vaicājuma izpildes rezultāts sniegs citus datus.
  3. Repeatable Read: Transakcija redz tikai tos datus, kas ir apstiprināti pirms tās sākuma. Garantē, ka atkārtoti lasījumi vienās un tajās pašās rindās transakcijas laikā sniegs tās pašas datus. Novērš "netīrus" un neatkārtojamus lasījumus. Atļauj fenomenu.

    // Repeatable Read piemērs
    // Transakcija 1
    // BEGIN TRANSACTION;
    // SELECT COUNT(*) FROM users WHERE status = 'active'; // Piemēram, 100
    
    // Transakcija 2 (vienlaikus)
    // BEGIN TRANSACTION;
    // INSERT INTO users (name, status) VALUES ('Jauns lietotājs', 'active');
    // COMMIT;
    
    // Transakcija 1
    // SELECT COUNT(*) FROM users WHERE status = 'active'; // Vēl 100 (fenomens)
    // COMMIT;
    
  4. Serializable: Augstākais līmenis. Garantē, ka paralēli izpildītās transakcijas būs ekvivalentas kādai secīgai izpildei. Novērš "netīrus" lasījumus, neatkārtojamus lasījumus un fenomenu. Var samazināt veiktspēju, bloķējot.

Dažādās datu bāzu pārvaldības sistēmās var būt savas realizācijas un īpatnības, kā arī papildu līmeņi. Piemēram, MySQL InnoDB pēc noklusējuma izmanto Repeatable Read līmeni.