Comment vérifier les opérations en attente dans une transaction PostgreSQL
-
22-07-2019 - |
Question
J'ai une session (SQLAlchemy) sur PostgreSQL, avec une transaction non validée active. Je viens de transmettre la session à une arborescence d'appels qui peut ou non avoir émis des instructions SQL INSERT
/ UPDATE
/ DELETE
, par . sqlalchemy.orm
ou directement via la connexion sous-jacente.
Existe-t-il un moyen de vérifier si des instructions de modification de données sont en attente dans cette transaction? C'est à dire. si commit serait un no-op ou non, et si le retour en arrière ferait disparaître quelque chose ou pas?
J'ai vu des gens signaler v $ transaction
dans Oracle pour la même chose (voir cette question SO ). Je recherche quelque chose de similaire à utiliser sur PostgreSQL.
La solution
Commencez par vérifier dans la vue système pg_locks.
http://www.postgresql.org/docs/ 8.4 / interactif / view-pg-locks.html
Autres conseils
Considérez la séquence d'instructions suivante:
select txid_current();
begin;
select txid_current();
Si l'identifiant de transaction renvoyé par les deux sélections est égal, il y a transaction ouverte. Sinon, il n'y en avait pas (mais maintenant).
Si les chiffres sont différents, un effet secondaire sera simplement d'ouvrir une transaction que vous voudrez probablement fermer.
MISE À JOUR : En fait, comme l'a souligné @ r2evans (merci pour votre perspicacité!), vous n'avez pas besoin de l'option "begin". - txid_current () retournera le même nombre que si vous êtes dans une transaction.
Non, pas du niveau base de données, vraiment. Peut-être que vous pouvez ajouter des traces au niveau de sqlalchemy pour le suivre?
Aussi, comment définissez-vous un no-op? Que se passe-t-il si vous mettez à jour une valeur avec la même valeur qu’avant, s’agit-il d’un non-op ou non? Du point de vue des bases de données, s’il en avait une, ce ne serait pas un non-fonctionnement. Mais du point de vue des applications, ce serait probablement le cas.