5

Se una stored procedure non riesce nel mezzo, le modifiche a quel punto dall'inizio del roll back SP implicitamente o dobbiamo scrivere qualsiasi codice esplicito per assicurarsi che SP venga eseguito solo in una transazione di database?Le procedure memorizzate vengono eseguite nella transazione del database in Postgres?

+0

possibile duplicato di [Esegui stored procedure postgreSQL come una transazione] (http://stackoverflow.com/questions/26406111/execute-postgresql-stored-procedure-as-one-transaction) –

+0

Tutto coperto nel manuale. Compreso il fatto che tecnicamente non hai stored procedure in PostgreSQL –

+0

Quindi hai la tua risposta? –

risposta

15

Attualmente Postgres non al momento (fino alla versione 9.5 inclusa) ha "stored procedure" come definito nello standard ANSI. Tutto invece è fatto con "funzioni", che forniscono quasi la stessa funzionalità (e più) degli altri RDBMS che forniscono procedure memorizzate. La principale differenza è la gestione delle transazioni.

Functions sono atomica in Postgres ed eseguire automaticamente all'interno della propria transazione a meno che chiamato all'interno di una transazione esterna. Corrono sempre all'interno di una singola transazione e hanno successo o falliscono completamente. Di conseguenza, non è possibile iniziare o eseguire transazioni all'interno della funzione. E comandi come VACUUM o CREATE INDEX CONCURRENTLY che non possono essere eseguiti all'interno di un blocco di transazione non sono consentiti.

Per documentation on PL/pgSQL:

funzioni e le procedure di attivazione sono sempre eseguiti all'interno di una transazione stabilito da una query esterna - non possono avviare o commettere tale operazione, dal momento che non ci sarebbe alcun contesto per loro di esecuzione in. Tuttavia, un blocco contenente una clausola costituisce una transazione di trasferimento che può essere annullata senza lo che interessa la transazione esterna.

Error handling:

Per default, qualsiasi errore che si verificano in una funzione PL/pgSQL interrompe esecuzione della funzione, e in effetti dell'operazione circostante pure. È possibile intercettare gli errori e ripristinarli utilizzando un blocco con una clausola EXCEPTION.

Ci sono speciali eccezioni, compresi, ma non limitati a:

  • dati scritti nei file di log
  • changes made to a sequence

    Importante: alcuni tipi di dati di PostgreSQL e le funzioni hanno regole speciali r egarding comportamento transazionale. In particolare, le modifiche apportate a una sequenza (e quindi il contatore di una colonna dichiarata utilizzando serial) sono immediatamente visibili a tutte le altre transazioni e non vengono ripristinate indietro se la transazione che ha annullato le modifiche.

  • istruzioni preparate

  • dblink chiama