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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top