Middle
Ce sunt blocările în contextul lucrului cu bazele de date și de ce sunt necesare?
sobes.tech AI
Răspuns de la AI
Blocările din bazele de date sunt mecanisme utilizate pentru a gestiona accesul mai multor utilizatori sau procese la aceleași date în același timp. Ele previn conflictele și mențin integritatea datelor într-un mediu concurențial.
Sunt necesare pentru a rezolva următoarele probleme:
- Condții de cursă (Race Conditions): Situație în care ordinea de executare a operațiilor influențează rezultatul final. Blocările asigură că operațiile se realizează secvențial sau într-o ordine sigură pentru date.
- Citiri inconsistente (Inconsistent Reads): Un proces citește date în timp ce altul le modifică, ceea ce poate duce la obținerea unui stadiu intermediar sau incomplet al datelor. Blocările pot preveni acest lucru.
- Actualizări pierdute (Lost Updates): Două procese citesc aceleași date, le modifică și apoi le salvează. Ultima salvare suprascrie modificările primului, pierzându-le. Blocările ajută la evitarea pierderii modificărilor.
- Citiri fantomă (Phantom Reads): În cadrul unei singure tranzacții, o interogare repetată returnează un set diferit de rânduri deoarece alt proces a adăugat sau eliminat rânduri care îndeplinesc condițiile interogării.
Tipuri principale de blocări:
- Partajate (Shared/Read Lock): Permite mai multor tranzacții să citească aceleași date simultan. Nu permite blocări de scriere pe acele date.
- Exclusiv (Exclusive/Write Lock): Oferă acces monopolist asupra datelor. Doar o singură tranzacție poate avea o blocare exclusivă pe anumite date într-un moment dat. Nu permite blocări de citire sau scriere pe acele date.
Blocările pot fi aplicate la diferite niveluri:
- Nivelul bazei de date: Se blochează întreaga bază de date. Rar utilizat.
- Nivelul tabelului: Se blochează întregul tabel. Mai puțin granular, poate reduce concurența.
- Nivelul rândului: Se blochează un rând specific. Mai granular, suportă o concurență ridicată, dar poate necesita mai multe resurse.
- Nivelul paginii: Se blochează o pagină de date (unitate de stocare în SGBD care conține mai multe rânduri). Un compromis între blocarea întregului tabel și a unui rând.
Implementarea blocărilor depinde de SGBD-ul specific (de exemplu, InnoDB și MyISAM în MySQL au strategii diferite, PostgreSQL etc.). În PHP, se folosesc adesea tranzacții pentru gestionarea blocărilor.
-- Exemplu de utilizare a unei tranzacții și blocare în SQL
START TRANSACTION;
SELECT balance FROM accounts WHERE account_id = 123 FOR UPDATE;
-- FOR UPDATE impune o blocare exclusivă pe rândul selectat
UPDATE accounts SET balance = balance - 100 WHERE account_id = 123;
COMMIT;
-- Sau ROLLBACK în caz de eroare