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.
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
INSERT INTO orders (user_id, total) VALUES (1, 100);
COMMIT; -- Scrive i cambiamentiSe 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:
ROLLBACK; -- Annulla i cambiamenti ed ignora le 2 query mandate nel bloccoProva tu
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.
Mostra suggerimento
Inizia con BEGIN;, modifica gli orders per id = 5 verso status='shipped', poi dai invio con COMMIT;
Soluzione disponibile dopo 3 tentativi
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.
Mostra suggerimento
BEGIN;, la delete di tabula rasa per 'reviews', e poi il magico ROLLBACK; alla fine.
Soluzione disponibile dopo 3 tentativi