Vai al contenuto
eLearner.app
Modulo 11 · Lezione 1 di 441/57 nel corso~15 min
Lezioni del modulo (1/4)

Transazioni ACID (BEGIN/COMMIT)

Le basi di solidità per ogni database si fondano sull'acronimo ACID:

  • Atomicity: un'operazione o si completa per intero (Commit), o fallisce senza lasciare tracce a metà (Rollback).
  • Consistency: le regole del database (es. vincoli, Foreign Keys) sono sempre rispettate.
  • Isolation: le transazioni che avvengono nello stesso momento non si intralciano a vicenda in modo incontrollato.
  • Durability: dopo il Commit, la modifica è irreversibilmente scritta su disco.

Sintassi delle transazioni

Normalmente ogni singola query UPDATE o DELETE viene considerata una transazione autonoma (autocommit). Ma quando vuoi raggruppare operazioni multiple, ad esempio stornare i soldi al cliente ed effettuare l'ordine, devi farlo usando esplicitamente la sintassi di transazione.

SQL
BEGIN;

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

COMMIT; -- Scrive i cambiamenti

Se durante queste complesse esecuzioni l'app JavaScript che ha inviato la query si rende conto di un problema (ad esempio non c'è molta disponibilità nel magazzino e si pianta) allora invierebbe un:

SQL
ROLLBACK; -- Annulla i cambiamenti ed ignora le 2 query mandate nel blocco

Prova tu

Esercizio#sql.m11.l1.e1
Tentativi: 0Caricamento…

Apri un transazione.\nAggiorna il prodotto con ID 10 portando la sua 'quantity' a 0 nella tabella temporanea (no aspetta, la 'quantity' non sta sui products, inventiamo: modifica il 'unit_price' in 'order_items' ma questo richiede un vincolo.\nFacciamo meglio: Aggiorna lo status dell'ordine ID 5 a 'shipped' e compila con successo la transazione.

Caricamento editor…
Mostra suggerimento

Inizia con BEGIN;, modifica gli orders per id = 5 verso status='shipped', poi dai invio con COMMIT;

Soluzione disponibile dopo 3 tentativi

Esercizio#sql.m11.l1.e2
Tentativi: 0Caricamento…

Panico in produzione! Un dev ha scritto una DELETE senza il WHERE, cancellando storicamente tutte le recensioni.\nFacciamogli vedere come si usa il rollback. Inizia una transazione, lancia una DELETE veloce che cancelli tutto dai 'reviews' (senza blocco where), ma poi usa il salvagente SQL per annullare l'impatto prima di completare il blocco.

Caricamento editor…
Mostra suggerimento

BEGIN;, la delete di tabula rasa per 'reviews', e poi il magico ROLLBACK; alla fine.

Soluzione disponibile dopo 3 tentativi