Sobes.tech
Middle

Mis on lukustused andmebaasidega töötamise kontekstis ja miks need on vajalikud?

sobes.tech AI

Vastus AI-lt

Andmebaasi lukustused on mehhanismid, mida kasutatakse mitme kasutaja või protsessi juurdepääsu juhtimiseks samadele andmetele samaaegselt. Need takistavad konflikte ja säilitavad andmete terviklikkuse konkurentsiolukorras.

Need on vajalikud järgmiste probleemide lahendamiseks:

  • Race Conditions: Situatsioon, kus operatsioonide täitmise järjekord mõjutab lõplikku tulemust. Lukustused tagavad, et operatsioonid toimuvad järjest või turvalises järjekorras.
  • Inconsistent Reads: Kui üks protsess loeb andmeid, samal ajal muudab teine, mis võib viia vahe- või mittetäieliku andmeteadeni. Lukustused võivad seda vältida.
  • Lost Updates: Kui kaks protsessi loevad samu andmeid, muudavad neid ja salvestavad, viimane kirjutab üle esimese muudatused, kaotades need. Lukustused aitavad vältida andmete kadumist.
  • Phantom Reads: Ühes transaktsioonis korduv päring tagastab teise komplekti ridu, kuna teine protsess on lisanud või eemaldanud ridu, mis vastavad päringutingimustele.

Peamised lukustustüübid:

  • Shared (Read Lock): Lubab mitmel transaktsioonil samaaegselt lugeda samu andmeid. Ei luba kirjutuslukustusi.
  • Exclusive (Write Lock): Annab monopolilise juurdepääsu andmetele. Ainult üks transaktsioon võib omada eksklusiivset lukustust teatud andmetele ühel ajal. Ei luba lugemis- ega kirjutuslukustusi samaaegselt.

Lukustusi saab rakendada erinevatel tasemetel:

  • Andmebaasi tase: Lukustab kogu andmebaasi. Harva kasutatakse.
  • Tabeli tase: Lukustab kogu tabeli. Vähem detailne, võib vähendada konkurentsi.
  • Rida tase: Lukustab üksiku rea. Rohkem detaili, toetab kõrget konkurentsi, kuid võib nõuda rohkem ressursse.
  • Lehe tase: Lukustab andmelehe (salvestusüksus, mis sisaldab mitut rida). Tasakaal tabeli ja rea taseme vahel.

Lukustuste rakendamine sõltub konkreetsest DBMS-ist (näiteks InnoDB ja MyISAM MySQL-is kasutavad erinevaid strateegiaid, PostgreSQL jne). PHP-s kasutatakse sageli transaktsioone lukustuste haldamiseks.

-- Näide transaktsiooni ja lukustuse kasutamisest SQL-is
START TRANSACTION;

SELECT balance FROM accounts WHERE account_id = 123 FOR UPDATE;
-- FOR UPDATE kehtestab eksklusiivse lukustuse valitud reale

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

COMMIT;
-- Või ROLLBACK vea korral