J'ai une requête batch que j'exécute quotidiennement sur ma base de données. Cependant, il semble rester bloqué à l'état inactif, et j'ai beaucoup de difficulté à déboguer ce qui se passe.
La requête est une agrégation sur une table qui est simultanément insérée, ce qui, je suppose, est en quelque sorte lié au problème. (L'agrégation est basée sur les données des jours précédents, donc les insertions ne devraient pas affecter les résultats.)
Des indices
J'exécute cela dans un script python en utilisant sqlalchemy. Cependant, j'ai défini le niveau de transaction sur l'autocommit, donc je ne pense pas que les choses soient enveloppées dans une transaction. D'un autre côté, je ne vois pas la requête se bloquer lorsque je l'exécute manuellement dans le terminal SQL.
En interrogeant
pg_stat_activity
, la requête vient initialement dans la base de données en tant questate='active'
. Après peut-être 15 secondes, l'état passe à `` inactif '' et en outre, lexact_start
est défini surNULL
. L'indicateur d'attente n'est jamais défini sur true.Avant de comprendre la validation automatique au niveau de la transaction pour sqlalchemy, elle se bloquait plutôt dans l'état
'idle in transaction'
plutôt que'idle'
. Et il se bloque peut-être un peu moins fréquemment depuis ce changement?
Je sens que je ne suis pas équipé pour creuser plus profondément que je ne l'ai fait à ce sujet. Tout commentaire, même en expliquant davantage sur les différents états et les internes postgres pertinents sans donner de réponse définitive, serait grandement apprécié.
la source
COMMIT
n'a été émise pour mettre fin à la transaction. Il semble que votre problème soit ailleurs que dans la base de données ..Réponses:
La première chose que vous devez séparer ici sont les mots requête , transaction et connexion .
Indice: votre requête est exécutée - elle est à l'état actif. Après cela, la requête se termine mais la connexion reste activée - l'état inactif. Il n'y a pas de transaction (elle a été validée) donc le
xact_start
est nul. Vous devez donc fermer la connexion une fois la requête réussie.Indice: Avant que l'autocommit ne soit activé, la requête a été laissée au milieu de la transaction, vous devez donc d'abord
commit
et ensuiteclose connection
.la source