Saltar al contenido principal
eLearner.app
Módulo 11 · Lección 1 de 441/57 en el curso~15 min
Lecciones del módulo (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

Ejercicio#sql.m11.l1.e1
Intentos: 0Cargando...

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.

Cargando editor...
Mostrar pista

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

Solución disponible después de 3 intentos

Ejercicio#sql.m11.l1.e2
Intentos: 0Cargando...

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.

Cargando editor...
Mostrar pista

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

Solución disponible después de 3 intentos