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.
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
INSERT INTO orders (user_id, total) VALUES (1, 100);
COMMIT; -- Writes the changesDacă î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:
ROLLBACK; -- Cancels the changes and discards the 2 queries sent in the blockÎncercați-l singur
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ă.
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
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.
Afișează indiciu
BEGIN;, ștergerea curată pe „recenzii”, și apoi ROLLBACK magic; la sfârșitul.
Soluție disponibilă după 3 încercări