Provenendo dal mondo MS SQL, tendo a fare un uso pesante delle stored procedure. Al momento sto scrivendo un'applicazione che usa molte funzioni di plpgsql di PostgreSQL. Quello che mi piacerebbe fare è il rollback di tutti gli INSERTI/AGGIORNAMENTI contenuti in una particolare funzione se ottengo un'eccezione in qualsiasi punto al suo interno.PostgreSQL: rollback di una transazione all'interno di una funzione plpgsql?
Inizialmente avevo l'impressione che ogni funzione fosse racchiusa nella propria transazione e che un'eccezione avrebbe automaticamente ripristinato tutto. Tuttavia, questo non sembra essere il caso. Mi chiedo se dovrei usare i punti di salvataggio in combinazione con la gestione delle eccezioni, invece? Ma non capisco davvero la differenza tra una transazione e un punto di salvataggio per sapere se questo è l'approccio migliore. Qualche consiglio per favore?
CREATE OR REPLACE FUNCTION do_something(
_an_input_var int
) RETURNS bool AS $$
DECLARE
_a_variable int;
BEGIN
INSERT INTO tableA (col1, col2, col3)
VALUES (0, 1, 2);
INSERT INTO tableB (col1, col2, col3)
VALUES (0, 1, 'whoops! not an integer');
-- The exception will cause the function to bomb, but the values
-- inserted into "tableA" are not rolled back.
RETURN True;
END; $$ LANGUAGE plpgsql;
Puoi pubblicare un esempio di una funzione che non esegue il rollback di tutto come ti aspetteresti? Le funzioni PL/pgSQL * do * vengono eseguite all'interno del contesto della transazione dell'istruzione chiamante, ma un blocco BEGIN..EXCEPTION può modificare tale comportamento. Senza vedere un esempio, è difficile dare il consiglio adeguato. –
Modificato per aggiungere un esempio. Grazie. – jamieb
Sto eseguendo 8.4.2, creato tableA e B con tre colonne int ciascuna, esegui il tuo esempio (con ";" rimosso alla fine di INSERT INTO nella riga della tabellaB) e bombardato. Ho controllato entrambi i tavoli e erano entrambi vuoti. Ho anche aggiunto un po 'di codice di debug tra i due per verificare che il record fosse lì prima che fallisse, quindi non c'era più dopo l'errore. –