Skip to content

Cum să înțelegi proprietățile ACID în baze de date

DodaTech Updated 2025-01-15 3 min read

In this tutorial, you'll learn about Cum să înțelegi proprietățile ACID în baze de date. We cover key concepts, practical examples, and best practices.

Cum să înțelegi proprietățile ACID (Atomicitate, Consistență, Izolare, Durabilitate) în baze de date relaționale și de ce sunt esențiale pentru integritatea datelor în tranzacții concurente.

Problema

Când mai multe tranzacții rulează simultan sau când o tranzacție eșuează la jumătate, datele pot ajunge într-o stare coruptă. Fără garanțiile ACID, aplicațiile financiare, de inventory sau booking ar pierde constant integritatea datelor.

The Wrong Way

Executarea operațiilor fără a înțelege implicațiile asupra consistenței:

-- Utilizatorul A verifică disponibilitatea
SELECT stock FROM products WHERE id = 1;  -- stock = 1

-- Utilizatorul B cumpără ultimul produs

-- Utilizatorul A plasează comanda
UPDATE products SET stock = 0 WHERE id = 1;
-- Problema: ambii utilizatori cred că au cumpărat ultimul produs

Fără izolare (isolation), cele două tranzacții interferează. Fără atomicitate, o eroare la mijloc lasă datele inconsistent.

The Right Way

Garanțiile ACID oferite de bazele de date relaționale:

Atomicitate — Totul sau nimic

O tranzacție se execută integral sau se anulează complet:

BEGIN;
  UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
  -- Eroare aici (ex: constraint violation)
ROLLBACK;  -- soldul contului 1 este restaurat

Consistență — Datele respectă regulile

Tranzacțiile transformă baza de date dintr-o stare validă în alta. Constrângerile (UNIQUE, FOREIGN KEY, CHECK) sunt verificate:

CREATE TABLE accounts (
    id INT PRIMARY KEY,
    balance DECIMAL(10,2) CHECK (balance >= 0)
);

BEGIN;
  UPDATE accounts SET balance = -500 WHERE id = 1;
  -- EROARE: CHECK constraint violation
ROLLBACK;

Izolare — Tranzacțiile nu se interferează

Nivelurile de izolare (READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE) controlează vizibilitatea modificărilor între tranzacții:

-- Sesiunea 1
BEGIN;
UPDATE products SET stock = stock - 1 WHERE id = 1;
-- Încă nu am dat COMMIT

-- Sesiunea 2 (READ COMMITTED)
SELECT stock FROM products WHERE id = 1;
-- Va vedea valoarea veche (stock neschimbat)

Durabilitate — Datele persistă după COMMIT

Odată ce tranzacția face COMMIT, datele sunt scrise pe disk și supraviețuiesc restartului sau căderii sistemului:

BEGIN;
  INSERT INTO audit_log (event) VALUES ('payment_received');
COMMIT;
-- Chiar dacă serverul cade acum, acest rând persistă

Step-by-Step Fix

1. Alege nivelul de izolare potrivit

-- PostgreSQL: setează nivelul de izolare
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- Cele mai comune nivele:
-- READ COMMITTED (default PostgreSQL) - previne dirty reads
-- REPEATABLE READ - previne și non-repeatable reads
-- SERIALIZABLE - previne și phantom reads

2. Verifică consistența cu constrângeri

ALTER TABLE orders
ADD CONSTRAINT positive_total CHECK (total >= 0);

3. Asigură durabilitatea

În PostgreSQL, parametrul fsync controlează durabilitatea. Setează synchronous_commit = on pentru garanție maximă.

Prevention Tips

  • Alege READ COMMITTED pentru aplicații web uzuale
  • Folosește SERIALIZABLE doar când ai nevoie de garanția maximă și suporți performanța redusă
  • Verifică constrângerile (CHECK, UNIQUE) corespunzător modelului de date
  • Nu dezactiva fsync în producție — riști pierderea datelor la crash

Greșeli comune cu ACID

  1. Confundarea atomicității cu izolarea — sunt proprietăți distincte
  2. READ UNCOMMITTED în producție — permite dirty reads, pierzi integritatea
  3. Ignorarea constrângerilor — date corupte ajung în baza de date
  4. Nivel de izolare prea ridicat — SERIALIZABILE scade drastic concurența
  5. Asumarea că o bază NoSQL este ACID — majoritatea bazelor NoSQL sacrifică ACID pentru scalabilitate

Exercițiu practic

Creează un scenariu care demonstrează dirty read (când o tranzacție citește date necommited de la alta), apoi configurează READ COMMITTED pentru a-l preveni.

FAQ

### Care este diferența dintre ACID și BASE?

ACID (Atomicity, Consistency, Isolation, Durability) este folosit de bazele relaționale. BASE (Basically Available, Soft state, Eventual consistency) este folosit de bazele NoSQL pentru scalabilitate orizontală.

Ce nivel de izolare ar trebui să folosesc?

READ COMMITTED pentru majoritatea aplicațiilor web. REPEATABLE READ pentru raportări financiare. SERIALIZABLE doar când corectitudinea absolută este critică și concurența este scăzută.

PostgreSQL este ACID-compliant?

Da. PostgreSQL este complet ACID-compliant din versiunile timpurii. Oferă toate cele patru niveluri de izolation și garantează durabilitatea prin WAL (Write-Ahead Log).

Construit de dezvoltătorii Doda Browser, DodaZIP și Durga Antivirus Pro. Uneltele DodaTech se integrează nativ cu bazele de date pentru productivitate și securitate sporite.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro