Salt la conținutul principal
Modulul 8 · Lecția 4 din 432/57 în curs~10 min
Lecții din modul (4/4)

Tranzacții: totul sau nimic

O tranzacție este un grup de operațiuni pe care baza de date le tratează o singură unitate: fie toți reușesc, fie niciunul dintre ei nu părăsește a urmă. Acesta este modul în care te protejezi de inconsecvențe atunci când o secvență din UPDATE/INSERT/DELETE trebuie să rămână consecventă.

Sintaxa

SQL
BEGIN;             -- apri la transazione

UPDATE …;
INSERT …;
DELETE …;
SELECT …;          -- puoi anche solo leggere

COMMIT;            -- conferma tutte le modifiche
-- oppure
ROLLBACK;          -- annulla tutte le modifiche, come se nulla fosse

Totul dintre BEGIN și COMMIT este atomic: nicio altă conexiune vede starea intermediară. Dacă programul se blochează sau se execută ROLLBACK, baza de date rămâne exact ca înainte de BEGIN.

Scenariul clasic: transferul

Exemplul canonic este un transfer de stoc între produse (sau bani transfer între conturi): două UPDATE care trebuie să reușească împreună, niciodata unul da si celalalt nu.

SQL
BEGIN;
UPDATE products SET stock = stock - 1 WHERE id = 1;
UPDATE products SET stock = stock + 1 WHERE id = 2;
COMMIT;

Dacă al doilea UPDATE eșuează (de exemplu, o eroare de constrângere CHECK), o ROLLBACK restabilește stocul produsului 1 la valoarea sa inițială.

ROLLBACK: depanatorul DBA

SQL
BEGIN;
UPDATE customers SET city = 'X' WHERE id = 1;
SELECT first_name, city FROM customers WHERE id = 1;   -- "vedo come è cambiato"
ROLLBACK;

Un model foarte util pentru încercarea un UPDATE pe date reale: tu rulați-l, inspectați rezultatul cu un SELECT în aceeași tranzacție și dacă nu te convinge, tu ROLLBACK — baza de date este exact ca a fost înainte.

SAVEPOINT: derulare parțială

În cadrul unei tranzacții puteți crea puncte intermediare:

SQL
BEGIN;
UPDATE customers SET city = 'A' WHERE id = 1;
SAVEPOINT step1;
UPDATE customers SET city = 'B' WHERE id = 2;
-- mi sono accorto che il secondo UPDATE è sbagliato:
ROLLBACK TO SAVEPOINT step1;
COMMIT;     -- solo il primo UPDATE viene confermato

ACID în 30 de secunde

Tranzacțiile garantează proprietățile ACID:

  • Atomicitate — totul sau nimic;
  • Consistență — constrângerile rămân satisfăcute la începutul și la sfârșitul tranzacției;
  • Iizolare — tranzacțiile concurente nu văd stări intermediare (la diferite „niveluri”);
  • Durability — un COMMIT de succes nu se pierde nici în cazul unui accident.

Rândul tău

Exercițiu#sql.m8.l4.e1
Încercări: 0Se încarcă…

Într-o singură tranzacție: reduceți cu 1 stocul produsului 1 și creșteți cu 1 stocul produsului 2. Deschideți cu BEGIN și închideți cu COMMIT.

Se încarcă editorul...
Afișează indiciu

Stoc de referință - 1 și stoc + 1 în clauzele SET respective.

Soluție disponibilă după 3 încercări

Exercițiu de revizuire

Exercițiu#sql.m8.l4.e2
Încercări: 0Se încarcă…

Deschideți o tranzacție, încercați să actualizați orașul clientului cu id=1 la „Sperimentale”, apoi anulați operațiunea cu ROLLBACK. La sfârșit, orașul clientului 1 trebuie să fie cel original („Milano”).

Se încarcă editorul...
Afișează indiciu

ROLLBACK anulează fiecare modificare făcută de la BEGIN înainte.

Soluție disponibilă după 3 încercări