Salt la conținutul principal
Modulul 11 · Lecția 1 din 441/57 în curs~15 min
Lecții din modul (1/4)

Tranzacții cu ACID (BEGIN/COMMIT)

Bazele fiabilității oricărei baze de date se bazează pe acronimul ACID:

  • Atomicity: o operație fie se finalizează în întregime (Commit), fie eșuează, fără a lăsa urme pe jumătate în urmă (Rollback).
  • Consistență: regulile bazei de date (de exemplu, constrângeri, chei externe) sunt întotdeauna respectate.
  • Iizolare: tranzacțiile care au loc în același timp nu interferează între ele în moduri necontrolate.
  • Durabilitate: după un Commit, modificarea este scrisă ireversibil pe disc.

Sintaxa tranzacției

În mod normal, fiecare interogare UPDATE sau DELETE este tratată ca o tranzacție autonomă (comitare automată). Dar atunci când doriți să grupați mai multe operațiuni împreună, de exemplu debitarea contului clientului și plasarea comenzii, trebuie să faceți acest lucru în mod explicit folosind sintaxa tranzacției.

SQL
BEGIN;

UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
INSERT INTO orders (user_id, total) VALUES (1, 100);

COMMIT; -- Writes the changes

Dacă în timpul acestor execuții complexe, aplicația JavaScript care a trimis interogarea realizează că există o problemă (de exemplu, nu există suficient stoc în depozit și se blochează), ar trimite un:

SQL
ROLLBACK; -- Cancels the changes and discards the 2 queries sent in the block

Încercați-l singur

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

Deschideți o tranzacție.\nActualizați produsul cu ID-ul 10, setându-și „cantitatea” la 0 în tabelul temporar (nu așteptați, „cantitatea” nu este pe produse, să inventăm: modificați „prețul_unității” în „articole_comandă”, dar asta necesită o constrângere.\nSă facem mai bine: actualizați starea ID-ului comenzii 5 pentru a finaliza cu succes tranzacția expediată.

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

Începeți cu BEGIN;, schimbați comenzile pentru id = 5 în status='shipped', apoi trimiteți-le cu COMMIT;

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

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

Panica in productie! Un dezvoltator a scris un DELETE fără WHERE, ștergând istoric toate recenziile.\nSă le arătăm cum se face derularea. Începeți o tranzacție, declanșați o ștergere rapidă care șterge totul de la „recenzii” (fără o clauză WHERE), dar apoi utilizați salvatorul SQL pentru a anula impactul înainte de a finaliza blocarea.

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

BEGIN;, ștergerea curată pe „recenzii”, și apoi ROLLBACK magic; la sfârșitul.

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