Do stored procedures run in database transaction in Postgres?

Strictly speaking, Postgres did not have stored procedures as defined in the ISO/IEC standard before version 11. The term is often used incorrectly to refer to functions, which provide much of the same functionality (and more) as other RDBMS provide with “stored procedures”. The main difference being transaction handling.

True stored procedures were finally introduced with Postgres 11:

Functions are atomic in Postgres and automatically run inside their own transaction unless called within an outer transaction. They always run inside a single transaction and succeed or fail completely. Consequently, one cannot begin or commit transactions within the function. And commands like VACUUM, CREATE DATABASE, or CREATE INDEX CONCURRENTLY which do not run in a transaction context are not allowed.

The manual on PL/pgSQL:

Functions and trigger procedures are always executed within a
transaction established by an outer query — they cannot start or
commit that transaction, since there would be no context for them to
execute in. However, a block containing an EXCEPTION clause
effectively forms a subtransaction that can be rolled back without
affecting the outer transaction.

Error handling:

By default, any error occurring in a PL/pgSQL function aborts
execution of the function, and indeed of the surrounding transaction
as well. You can trap errors and recover from them by using a BEGIN
block with an EXCEPTION clause.

There are exceptions, including but not limited to:

  • data written to log files

  • changes made to a sequence

    Important: Some PostgreSQL data types and functions have special rules
    regarding transactional behavior. In particular, changes made to a
    sequence (and therefore the counter of a column declared using serial)
    are immediately visible to all other transactions and are not rolled
    back if the transaction that made the changes aborts.

  • prepared statements
    SQL Fiddle demo

  • dblink calls (or similar)

Leave a Comment