Kokius transakcijų izoliacijos lygius žinote duomenų bazėse?
sobes.tech AI
Atsakymas iš AI
SQL standarte apibrėžti keturi transakcijų izoliacijos lygiai: Read Uncommitted, Read Committed, Repeatable Read, Serializable.
-
Read Uncommitted: Žemiausias lygis. Transakcija gali skaityti duomenis, kurie dar nebuvo patvirtinti (t.y., atlikti kita transakcija, kuri dar nebaigta
COMMIT). Tai sukelia "šiukšlinius" skaitymus (dirty reads). -
Read Committed: Transakcija mato tik tuos duomenis, kurie buvo patvirtinti iki jos pradžios arba jos vykdymo metu. Užkerta kelią "šiukšliniams" skaitymams, bet leidžia nepakartojamus skaitymus (non-repeatable reads) ir vaiduoklius (phantom reads).
- Nepakartojami skaitymai: Tas pats skaitymas vienoje transakcijoje grąžina skirtingus duomenis, nes kita transakcija tarp jų pakeitė ir patvirtino.
- Vaiduokliai: Kai užklausa su
WHEREsąlyga vykdoma, antroji transakcija prideda arba ištrina eilutes, atitinkančias sąlygą, ir pakartotinis to paties užklausos vykdymas grąžina kitą duomenų rinkinį.
-
Repeatable Read: Transakcija mato tik tuos duomenis, kurie buvo patvirtinti iki jos pradžios. Garantuoja, kad pakartotiniai tų pačių eilučių skaitymai vienoje transakcijoje grąžins tas pačias duomenis. Užkerta kelią "šiukšliniams" ir nepakartojamiems skaitymams. Leidžia vaiduoklius.
// Repeatable Read pavyzdys // Transakcija 1 // BEGIN TRANSACTION; // SELECT COUNT(*) FROM users WHERE status = 'active'; // Pavyzdžiui, 100 // Transakcija 2 (vykdoma tuo pačiu metu) // BEGIN TRANSACTION; // INSERT INTO users (name, status) VALUES ('Naujas naudotojas', 'active'); // COMMIT; // Transakcija 1 // SELECT COUNT(*) FROM users WHERE status = 'active'; // Dar 100 (vaiduoklis) // COMMIT; -
Serializable: Aukščiausias izoliacijos lygis. Garantuoja, kad paraleliai vykdomos transakcijos bus lygiavertės tam tikram jų vykdymo seka. Užkerta kelią "šiukšliniams" skaitymams, nepakartojamiems skaitymams ir vaiduokliams. Gali sumažinti našumą dėl užraktų.
Skirtingose duomenų bazių valdymo sistemose gali būti savo realizacijos ir ypatumų, taip pat papildomų lygių. Pavyzdžiui, MySQL InnoDB pagal numatytuosius nustatymus naudoja Repeatable Read lygį.