PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 07/12/2018 09:27:26

trainvapeur
Membre

fonction et transaction

Bonjour à tous,

j'ai l'impression qu'une transaction entoure chaque fonction. Est-ce vrai ?

A priori, cela ne me génerait pas trop sauf pour une table. Cette table est un mouchard dans lequel j'enregistre tout ce qu'il se passe dans l'application (pendant les tests cela devrait me permettre de savoir ce qu'il s'est passé juste avant un plantage). Or, si la fonction se plante alors que des enregistrements auraient du être créés dans le mouchard, ils n'y sont pas. Comment corriger ce problème ?

D'avance merci
Jean

Hors ligne

#2 07/12/2018 11:07:38

rjuju
Administrateur

Re : fonction et transaction

Oui chaque requête effectuée, appel de fonction ou pas, est forcément dans une transaction, même implicite.  Le problème est connu depuis longtemps.  Il y a trois solutions possibles:

- logger dans la table via  une connexion externe (par exemple avec l'extension dblink, ou pg_background)
- utiliser les transactions autonomes disponibles avec pg11 et CALL (procédure plutôt que fonction), mais je ne crois pas qu'on puisse mixer des procédures avec d'autres types de requête
- tracer les actions ailleurs, par exemple avec pg_audit

Hors ligne

#3 10/12/2018 10:20:24

trainvapeur
Membre

Re : fonction et transaction

Merci rjuju pour ces précisions. Pour le mouchard, je vais effectivement m'interesser aux traces (chapitre 19.8 du manuel) et à pg_audit. Ce point est très important pour nous puisque nous sommes en train d'évaluer Postgre en testant différentes options dans le but de remplacer les bases Oracle que nous avons en production.

Mais ta réponse m'inquiète beaucoup. L'application que je développe récupère règulièrement des données sur une base Oracle (3 mois de données, 50go) pour les historiser sur 5 ans (500go). Il y a une vingtaine de tables à traiter. J'avais pensé faire une boucle 'infinie' en plpgsql mais cela ne va pas fonctionner parce que les tables Postgre ne seront pas mises à jour à chaque itération. Vrai? Il faut donc lancer une fonction qui fait l'import des données et qui sera lancée par le planificateur des tâches sous windows, idem pour Linux. Vrai ?

La sueur perle sur mon front !!

Merci d'avance
Jean

Hors ligne

#4 Hier 16:08:23

trainvapeur
Membre

Re : fonction et transaction

Bonjour à tous,

est-ce que, si je crée ma table mouchard comme UNLOGGED, je vais pouvoir la mettre à jour à l'intérieur d'une transaction ?

Je vais essayer mais j'aimerai une confirmation !
Cordialement,
J. MAURICE

Hors ligne

#5 Hier 16:47:24

gleu
Administrateur

Re : fonction et transaction

Oui, c'est possible mais cette mise à jour ne sera visible par les autres sessions qu'une fois la transaction validée (comme pour toute mise à jour).

Hors ligne

Pied de page des forums