sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Los procedimientos almacenados se ejecutan en la transacción de la base de datos en Postgres?

Estrictamente hablando, Postgres no tenía procedimientos almacenados tal como se define en el estándar ISO/IEC antes de la versión 11. El término a menudo se usa incorrectamente para referirse a funciones , que brindan gran parte de la misma funcionalidad (y más) que otros RDBMS brindan con "procedimientos almacenados". La principal diferencia es el manejo de transacciones.

  • ¿Cuáles son las diferencias entre "Procedimientos almacenados" y "Funciones almacenadas"?

Verdaderos procedimientos almacenados finalmente se presentan con Postgres 11:

  • ¿Cuándo usar el procedimiento almacenado o la función definida por el usuario?

Funciones son atómicos en Postgres y se ejecuta automáticamente dentro de su propia transacción a menos que se llame dentro de una transacción externa. Siempre se ejecutan dentro de una sola transacción y tienen éxito o fallan completamente . En consecuencia, no se pueden iniciar ni realizar transacciones dentro de la función. Y comandos como VACUUM , CREATE DATABASE , o CREATE INDEX CONCURRENTLY que no se ejecutan en un contexto de transacción no están permitidos.

El manual sobre PL/pgSQL:

Las funciones y los procedimientos desencadenantes siempre se ejecutan dentro de una transacción establecida por una consulta externa:no pueden iniciar o confirmar esa transacción, ya que no habría contexto para que se ejecuten. Sin embargo, un bloque que contiene una EXCEPTION La cláusula forma efectivamente una subtransacción que se puede deshacer sin afectar la transacción externa.

Manejo de errores:

De forma predeterminada, cualquier error que ocurra en una función PL/pgSQL cancela la ejecución de la función y, de hecho, también de la transacción circundante. Puede atrapar errores y recuperarse de ellos usando un BEGIN bloque con una EXCEPTION cláusula.

Hay excepciones , incluyendo pero no limitado a:

  • datos escritos en archivos de registro
  • cambios realizados en una secuencia

    Importante :Algunos tipos de datos y funciones de PostgreSQL tienen reglas especiales con respecto al comportamiento transaccional. En particular, los cambios realizados en una secuencia (y por lo tanto el contador de una columna declarada usando serial )son inmediatamente visibles para todas las demás transacciones y no se revierten si la transacción que realizó los cambios se anula.

  • declaraciones preparadas

    • Demostración de SQL Fiddle
  • llamadas dblink (o similares)

    • ¿Admite Postgres transacciones anidadas o autónomas?