CodeGym /Corsi /SQL SELF /Comandi base per lavorare con le transazioni: BEGI...

Comandi base per lavorare con le transazioni: BEGIN, COMMIT, ROLLBACK

SQL SELF
Livello 39 , Lezione 1
Disponibile

Per tenere sotto controllo tutte le modifiche nel tuo database e assicurarti che tutto vada liscio, PostgreSQL usa il concetto di transazione. È un gruppo di operazioni SQL che vengono eseguite come un tutt’uno. Se qualcosa va storto, bisogna annullare le modifiche. Ed è qui che entrano in gioco i comandi BEGIN, COMMIT e ROLLBACK.

I comandi delle transazioni non sono solo per “ordine” — hanno un ruolo chiave nel proteggere i dati da errori e crash. Quando esegui una serie di operazioni SQL, è importante essere sicuri che tutto funzioni bene: se un comando fallisce, il database deve tornare allo stato iniziale. Questa è una delle ragioni principali per cui servono i comandi di transazione — aiutano a mantenere la coerenza dei dati.

In più, le transazioni garantiscono la cosiddetta atomicità: o tutte le modifiche vengono applicate insieme, oppure nessuna. Così si evita che il database venga aggiornato “a metà” — tipo, i soldi vengono scalati ma il prodotto non viene aggiunto all’ordine.

E ovviamente, le transazioni danno flessibilità. Puoi costruire catene di azioni complesse, controllare quando confermare COMMIT o annullare ROLLBACK, e persino fare rollback parziali con SAVEPOINT. Tutto questo rende il lavoro col database non solo sicuro, ma anche gestibile.

Comando BEGIN

Il comando BEGIN dice a PostgreSQL che stai iniziando una transazione. Dopo averlo eseguito, tutte le modifiche che fai restano “in sospeso” finché non chiudi la transazione con COMMIT o annulli tutto con ROLLBACK.

Un esempio classico: supponiamo che vuoi trasferire 100 unità di valuta da un conto a un altro. Inizi la transazione con BEGIN:

BEGIN;
-- Iniziata la transazione
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- Bilancio diminuito sul conto 1
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
-- Bilancio aumentato sul conto 2
Importante:

Finché esegui comandi all’interno della transazione, gli altri utenti del database non vedranno le tue modifiche. Diventeranno visibili solo dopo il COMMIT.

Comando COMMIT

Il comando COMMIT chiude la transazione e salva tutte le modifiche fatte al database. Dopo questo comando, le modifiche sono visibili a tutti gli utenti.

Esempio di chiusura di una transazione:

COMMIT;
-- Tutte le modifiche della transazione sono state salvate

Ora le modifiche al bilancio che abbiamo fatto nell’esempio sopra sono diventate “permanenti”. I soldi sono stati trasferiti con successo.

Comando ROLLBACK

Se durante la transazione ti accorgi di un errore o decidi di annullare le modifiche, puoi usare il comando ROLLBACK. Annulla tutte le operazioni fatte dopo il comando BEGIN.

Supponiamo che durante il trasferimento dei soldi scopri che il conto non ha abbastanza fondi. Allora la transazione viene annullata:

BEGIN;
-- Iniziata la transazione
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;

-- Ops, errore: fondi insufficienti.
ROLLBACK;
-- Tutte le modifiche annullate, il database è tornato allo stato iniziale

Dopo il comando ROLLBACK nessuna modifica viene salvata nel database. È super comodo per evitare errori.

Esempio completo: trasferimento di soldi tra conti

Mettiamo tutto insieme. Ecco un esempio completo di transazione — con controllo del bilancio, trasferimento dei soldi e possibilità di rollback in caso di errore:

BEGIN;
-- Iniziamo la transazione

-- Controlliamo il bilancio sul conto
SELECT balance INTO current_balance FROM accounts WHERE account_id = 1;

-- Verifichiamo se ci sono abbastanza fondi
IF current_balance >= 100 THEN
    -- Se ci sono abbastanza fondi, facciamo il trasferimento
    UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
    UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
    COMMIT;
    -- Confermiamo le modifiche
ELSE
    -- Se i fondi non bastano, annulliamo la transazione
    ROLLBACK;
END IF;

Questo esempio mostra come i comandi di transazione lavorano insieme per evitare inconsistenze nei dati.

Importante

IF THEN ELSE END IF — sono operazioni delle stored procedure, che vedremo tra qualche livello:P

Particolarità della configurazione dell’autocommit

In PostgreSQL, di default è attivo il modo autocommit, quindi se esegui comandi fuori da una transazione esplicita, vengono subito salvati nel database. Per esempio:

UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- Le modifiche vengono salvate subito, anche senza COMMIT

Se vuoi gestire le transazioni manualmente, ti conviene sempre usare BEGIN per iniziare la transazione in modo esplicito.

Puoi disattivare l’autocommit per la sessione corrente con il comando:

SET AUTOCOMMIT TO OFF;

Ricorda: se l’autocommit è disattivato, dovrai chiudere ogni sessione con COMMIT o ROLLBACK.

Errori tipici quando si lavora con le transazioni

COMMIT dimenticato. Se ti dimentichi di fare COMMIT, le tue modifiche restano non concluse e andranno perse alla fine della sessione.

Lock. Finché la transazione non è chiusa, le risorse che usa possono restare bloccate. Questo può causare problemi di accesso concorrente ai dati.

ROLLBACK eccessivo. A volte i programmatori sono troppo scrupolosi e fanno rollback senza motivo. Questo porta a ricalcoli inutili e aumenta il carico sul database.

Transazioni sospese. Se inizi una transazione ma ti dimentichi di chiuderla (né COMMITROLLBACK), la sessione può rimanere bloccata e bloccare risorse del database.

Applicazione pratica

Ai colloqui per sviluppatore o DBA (database administrator) potrebbero chiederti come funzionano le transazioni in PostgreSQL. Capire i comandi BEGIN, COMMIT e ROLLBACK mostra che sai lavorare coi dati in modo sicuro ed efficace.

Nella pratica, le transazioni sono utilissime per costruire sistemi affidabili, tipo per gestire ordini negli e-commerce o calcolare punti bonus nei programmi fedeltà.

Ora che hai capito i comandi base delle transazioni, possiamo andare avanti e approfondire argomenti interessanti come l’uso di SAVEPOINT e i livelli di isolamento. PostgreSQL è un mare infinito di possibilità, quindi tieniti forte.

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION