CodeGym /Corsi /SQL SELF /Transazioni annidate: SAVEPOINT, ROLLBACK TO SAVEPOINT

Transazioni annidate: SAVEPOINT, ROLLBACK TO SAVEPOINT

SQL SELF
Livello 53 , Lezione 0
Disponibile

In PostgreSQL NON esistono vere transazioni annidate nel senso classico del termine. C'è solo una transazione esterna e "strati" di savepoint al suo interno.

Il termine "transazioni annidate" in PostgreSQL di solito significa usare i savepoint con i comandi SAVEPOINT, ROLLBACK TO SAVEPOINT, RELEASE SAVEPOINT. Non sono transazioni indipendenti, ma checkpoint speciali dentro una transazione esterna, a cui puoi tornare indietro senza dover annullare tutto.

Un esempio nella vita reale: stai scrivendo un testo lungo in un editor e ogni tanto fai ctrl+s. Se fai degli errori, puoi tornare a una delle versioni salvate precedenti senza perdere tutto il lavoro.

Comandi per gestire i savepoint

Per gestire le transazioni annidate, PostgreSQL offre tre comandi principali:

SAVEPOINT

Questo comando serve per creare un "savepoint" a cui puoi tornare se serve. Il savepoint funziona come un checkpoint nella nostra transazione.

SAVEPOINT mypoint;

ROLLBACK TO SAVEPOINT

Annulla parte delle modifiche fatte dopo il savepoint indicato, lasciando intatte le modifiche precedenti nella stessa transazione esterna.

ROLLBACK TO SAVEPOINT mypoint;

RELEASE SAVEPOINT

Elimina il savepoint. Dopo non puoi più tornarci.

RELEASE SAVEPOINT mypoint;

Esempio: inserire dati in più tabelle con possibilità di rollback

Supponiamo che tu stia lavorando su un sistema di gestione ordini dove devi salvare dati in due tabelle: orders e order_items. Un errore nell'inserimento in una tabella non deve causare il rollback dei dati dell'altra.

BEGIN; -- Inizio transazione

-- Creiamo un savepoint
SAVEPOINT before_order;

-- Inseriamo l'ordine nella tabella orders
INSERT INTO orders (order_id, customer_id, date)
VALUES (1, 101, CURRENT_DATE);

-- Se qui succede un errore — facciamo rollback
SAVEPOINT before_order_items;

-- Inseriamo i prodotti nella tabella order_items
INSERT INTO order_items (order_id, product_id, quantity)
VALUES (1, 2001, 4);

-- Se qualcosa va storto
-- ROLLBACK TO SAVEPOINT before_order_items;

-- Confermiamo la transazione (salviamo le modifiche)
COMMIT;

Se durante l'inserimento dei record in order_items si verifica un errore, puoi tornare al savepoint before_order_items, e le modifiche nella tabella orders rimarranno salvate.

Consigli pratici ed errori comuni

Ora che hai capito come funzionano i comandi SAVEPOINT e ROLLBACK TO SAVEPOINT, ecco qualche dritta per evitare problemi:

  1. Nomi dei savepoint. Usa nomi chiari e unici per i SAVEPOINT. Per esempio, before_insert, step1 e così via — ti aiuterà a orientarti durante il debug.
  2. Non dimenticare di rilasciare il SAVEPOINT. Se non pensi di tornare più a quel punto, eliminalo con RELEASE SAVEPOINT per non incasinare la transazione.
  3. Transazione annidata ≠ transazione separata. Ricorda che quando fai COMMIT tutti i savepoint vengono persi. Se il COMMIT esterno è fatto, non puoi più tornare indietro.
  4. Lock sui dati. Anche se torni a un savepoint, i lock sulle righe presi nella transazione restano. Occhio a questo quando lavori in ambienti multiutente.

Le transazioni annidate con SAVEPOINT e ROLLBACK TO SAVEPOINT danno agli sviluppatori uno strumento potente per gestire situazioni complicate. Ora puoi dividere le transazioni in step flessibili, gestire gli errori con delicatezza ed evitare rollback inutili. Ricorda: ogni volta che vedi la parola "rollback", non è sempre motivo di panico — a volte fare rollback è il modo migliore per andare avanti.

2
Compito
SQL SELF, livello 53, lezione 0
Bloccato
Utilizzo di una transazione annidata per gestire più operazioni
Utilizzo di una transazione annidata per gestire più operazioni
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION