PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Les procédures stockées s'exécutent-elles dans les transactions de base de données dans Postgres ?

À proprement parler, Postgres n'avait pas procédures stockées tel que défini dans la norme ISO/IEC avant la version 11. Le terme est souvent utilisé de manière incorrecte pour désigner les fonctions , qui fournissent une grande partie des mêmes fonctionnalités (et plus) que les autres SGBDR avec des "procédures stockées". La principale différence étant la gestion des transactions.

  • Quelles sont les différences entre les "procédures stockées" et les "fonctions stockées" ?

Véritables procédures stockées sont enfin introduits avec Postgres 11 :

  • Quand utiliser une procédure stockée ou une fonction définie par l'utilisateur ?

Fonctions sont atomiques dans Postgres et s'exécutent automatiquement dans leur propre transaction, sauf s'ils sont appelés dans une transaction externe. Ils s'exécutent toujours dans une seule transaction et réussissent ou échouent complètement . Par conséquent, on ne peut pas commencer ou valider des transactions au sein de la fonction. Et des commandes comme VACUUM , CREATE DATABASE , ou CREATE INDEX CONCURRENTLY qui ne s'exécutent pas dans un contexte de transaction ne sont pas autorisés.

Le manuel sur PL/pgSQL :

Les fonctions et les procédures de déclenchement sont toujours exécutées dans une transaction établie par une requête externe - elles ne peuvent pas démarrer ou valider cette transaction, car il n'y aurait pas de contexte pour leur exécution. Cependant, un bloc contenant une EXCEPTION La clause forme en fait une sous-transaction qui peut être annulée sans affecter la transaction externe.

Gestion des erreurs :

Par défaut, toute erreur survenant dans une fonction PL/pgSQL interrompt l'exécution de la fonction, ainsi que de la transaction environnante. Vous pouvez piéger les erreurs et les récupérer en utilisant un BEGIN bloquer avec une EXCEPTION clause.

Il existe des exceptions , y compris, mais sans s'y limiter :

  • données écrites dans les fichiers journaux
  • modifications apportées à une séquence

    Important :Certains types de données et fonctions PostgreSQL ont des règles spéciales concernant le comportement transactionnel. En particulier, les modifications apportées à une séquence (et donc au compteur d'une colonne déclarée avec serial ) sont immédiatement visibles pour toutes les autres transactions et ne sont pas annulées si la transaction qui a apporté les modifications est abandonnée.

  • relevés préparés

    • Démo SQL Fiddle
  • appels dblink (ou similaire)

    • Postgres prend-il en charge les transactions imbriquées ou autonomes ?