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
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 fosseTotul 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.
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
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:
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 confermatoACID î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
COMMITde succes nu se pierde nici în cazul unui accident.
Rândul tău
Î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.
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
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”).
Afișează indiciu
ROLLBACK anulează fiecare modificare făcută de la BEGIN înainte.
Soluție disponibilă după 3 încercări