Sobes.tech
Middle

Kas yra blokavimai duomenų bazių darbo kontekste ir kodėl jie yra būtini?

sobes.tech AI

Atsakymas iš AI

Duomenų bazės blokavimai yra mechanizmai, naudojami valdyti kelių vartotojų ar procesų prieigą prie tų pačių duomenų vienu metu. Jie užkerta kelią konfliktams ir palaiko duomenų vientisumą konkurencinėje aplinkoje.

Jie yra būtini sprendžiant šias problemas:

  • Race Conditions: Situacija, kai operacijų vykdymo tvarka įtakoja galutinį rezultatą. Blokavimai užtikrina, kad operacijos bus vykdomos nuosekliai arba saugiai.
  • Inconsistent Reads: Kai vienas procesas skaito duomenis, kol kitas juos keičia, tai gali sukelti tarpinį arba nebaigtą duomenų būseną. Blokavimai gali to išvengti.
  • Lost Updates: Kai du procesai skaito tuos pačius duomenis, juos keičia ir įrašo, paskutinis įrašymas perrašo pirmojo pakeitimus, juos prarasdamas. Blokavimai padeda išvengti duomenų praradimo.
  • Phantom Reads: Vienos transakcijos metu pakartotinis užklausa grąžina kitą eilučių rinkinį, nes kitas procesas pridėjo arba pašalino eilutes, atitinkančias užklausos sąlygas.

Pagrindiniai blokavimų tipai:

  • Shared (Read Lock): Leidžia kelioms transakcijoms vienu metu skaityti tas pačias duomenis. Neleidžia rašymo blokavimų.
  • Exclusive (Write Lock): Suteikia monopoliją prie duomenų. Tik viena transakcija gali turėti išskirtinį blokavimą tam tikriems duomenims vienu metu. Neleidžia nei skaitymo, nei rašymo blokavimų to paties duomenų.

Blokavimai gali būti taikomi skirtingais lygiais:

  • Database Level: Užblokuoja visą duomenų bazę. Retai naudojama.
  • Table Level: Užblokuoja visą lentelę. Mažiau detali, gali sumažinti konkurenciją.
  • Row Level: Užblokuoja atskirą eilutę. Daugiau detalių, palaiko aukštą konkurenciją, bet gali reikalauti daugiau išteklių.
  • Page Level: Užblokuoja duomenų puslapį (saugojimo vienetą, kuriame yra keli įrašai). Kompromisas tarp lentelės ir eilutės blokavimo.

Blokavimų įgyvendinimas priklauso nuo konkrečios DBMS (pavyzdžiui, InnoDB ir MyISAM MySQL turi skirtingas strategijas). PHP dažnai naudojamos transakcijos blokavimui valdyti.

-- Pavyzdys, kaip naudoti transakciją ir blokavimą SQL
START TRANSACTION;

SELECT balance FROM accounts WHERE account_id = 123 FOR UPDATE;
-- FOR UPDATE taiko išskirtinį blokavimą pasirinktam įrašui

UPDATE accounts SET balance = balance - 100 WHERE account_id = 123;

COMMIT;
-- Arba ROLLBACK klaidos atveju