CodeGym /Corsi /SQL SELF /Approfondiamo le transazioni

Approfondiamo le transazioni

SQL SELF
Livello 39, Lezione 0
Disponibile

Abbiamo già accennato nel corso a cosa sia una transazione. Te lo ricordo: è una sequenza di operazioni che deve essere eseguita come un tutt’uno. Tipo quando devi fare un bonifico bancario. In quel caso togli soldi da un conto e li aggiungi a un altro. Se una di queste azioni fallisce (tipo i soldi vengono tolti ma non aggiunti), si creano un sacco di problemi. Ed è proprio qui che le transazioni ci salvano la vita.

Una transazione o viene eseguita completamente, oppure non viene eseguita per niente. Questo è il principio del "tutto o niente".

BEGIN;
-- Diminuiamo il saldo su un conto
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- Aumentiamo il saldo sull’altro conto
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT; -- Applichiamo le modifiche

Se qualcosa va storto, puoi annullare le modifiche con ROLLBACK.

Cosa sono le proprietà ACID delle transazioni

Quando si parla di transazioni in PostgreSQL (e in generale nei database relazionali), spesso si sente l’acronimo ACID — e no, non è roba di chimica. ACID sta per Atomicity (atomicità), Consistency (coerenza), Isolation (isolamento), Durability (durabilità). Queste quattro proprietà fanno sì che i dati vengano gestiti in modo sicuro, coerente e senza sorprese.

Atomicità (Atomicity)
La transazione viene eseguita tutta o non viene eseguita per niente. Se qualcosa va storto dentro, tutto viene annullato. Immagina: stai trasferendo soldi e succede un errore — o si annulla tutto, o il trasferimento va a buon fine. Niente operazioni "a metà".

Coerenza (Consistency)
Dopo che la transazione è finita, il database resta in uno stato corretto e logico. Tutte le regole, i vincoli e le relazioni tra tabelle devono essere rispettate. Per esempio, se non è permesso avere un saldo negativo, una transazione che lo viola semplicemente non verrà salvata.

Isolamento (Isolation)
Finché una transazione non è conclusa, un’altra non deve vedere i suoi dati intermedi. Questo protegge da effetti strani, tipo vedere dati in uno stato "indefinito". Immagina che in un e-commerce i soldi siano già stati tolti ma il prodotto non sia ancora stato aggiunto all’ordine — non è il massimo, vero?

Durabilità (Durability)
Se una transazione si conclude con successo, tutte le sue modifiche sono garantite e salvate. Anche se subito dopo va via la corrente — i dati restano nel database. È come premere "Salva" e sapere che tutto è davvero al sicuro.

Queste quattro proprietà sono la base per cui le transazioni sono considerate un meccanismo affidabile quando si lavora con i database.

Esempi di scenari d’uso delle transazioni

La teoria è bella, ma la vera forza delle transazioni si vede nei casi reali. Proprio in queste situazioni — con soldi, tabelle collegate o modifiche di massa — le transazioni diventano uno strumento indispensabile. Ti aiutano non solo a fare operazioni, ma a farle con sicurezza, senza rischiare di perdere dati o lasciare il database in uno stato "mezzo rotto".

Ecco qualche esempio tipico dove le transazioni davvero salvano la situazione:

1. Gestione dei pagamenti

Quando un cliente trasferisce soldi da un conto a un altro, la transazione garantisce che i soldi non spariscano nel nulla:

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;

Se sul primo conto non ci sono abbastanza soldi, puoi annullare tutto:

BEGIN;
UPDATE accounts SET balance = balance - 500 WHERE account_id = 1;
-- Ops, saldo negativo!
ROLLBACK;

2. Aggiornamento di tabelle collegate

Immagina di aggiornare lo stato di uno studente a "laureato" e allo stesso tempo aggiungere una riga nella tabella "laureati":

BEGIN;
UPDATE students SET status = 'laureato' WHERE student_id = 42;
INSERT INTO graduates (student_id, graduation_date) VALUES (42, '2023-06-10');
COMMIT;

Se una delle operazioni fallisce (tipo c’è un errore nell’INSERT), il database torna allo stato iniziale.

3. Aggiornamento massivo dei dati

Le transazioni sono utili per fare grandi aggiornamenti, tipo:

BEGIN;
UPDATE orders SET status = 'completato' WHERE delivery_date < CURRENT_DATE;
COMMIT;

Se il server si blocca o ti accorgi che l’aggiornamento non era quello giusto, puoi annullare tutto in qualsiasi momento!

Comandi per lavorare con le transazioni

PostgreSQL offre alcuni comandi chiave:

  • BEGIN: inizia una nuova transazione:

    BEGIN;
    
  • COMMIT: conferma (salva) tutte le modifiche fatte nella transazione:

    COMMIT;
    

ROLLBACK: annulla tutte le modifiche fatte nella transazione corrente:

ROLLBACK;

Esempio di ciclo completo

BEGIN;
-- Alcune operazioni
UPDATE accounts SET balance = balance - 200 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 200 WHERE account_id = 2;

-- Decidiamo di annullare le modifiche
ROLLBACK;

-- Ricominciamo da capo
BEGIN;
-- Stesse operazioni, ma altro trasferimento
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;

-- Chiudiamo la transazione
COMMIT;

La vita delle transazioni fuori dal libro di testo

E-commerce. Tante piattaforme usano le transazioni per gestire ordini e pagamenti. Per esempio, un ordine viene eseguito solo se il pagamento va a buon fine. Se qualcosa va storto, l’ordine viene annullato in automatico.

Sistemi bancari. Le transazioni proteggono i tuoi soldi da problemi tipo un blackout improvviso.

Storico delle transazioni. PostgreSQL tiene i log WAL (Write-Ahead Logging) per recuperare i dati in caso di crash. È questa la magia che rende le transazioni affidabili.

Nella prossima lezione vedremo i comandi BEGIN, COMMIT e ROLLBACK più nel dettaglio, e daremo un’occhiata a esempi di operazioni massive e rollback parziali con SAVEPOINT. A presto!

2
Compito
SQL SELF, livello 39, lezione 0
Bloccato
Utilizzo di una transazione per aggiornamento di massa
Utilizzo di una transazione per aggiornamento di massa
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION