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 se fait sur les données des jours précédents, donc les insertions ne devraient pas affecter les résultats.)
Des indices
Je l'exécute à l'intérieur d'un script python utilisant sqlalchemy. Cependant, j'ai défini le niveau de transaction sur la validation automatique, donc je ne pense pas que les choses soient encapsulées dans une transaction. D'autre part , 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 arrive initialement dans la base de données sous la forme state='active'
. Après peut-être 15 secondes, l'état passe à "inactif" et en outre, le xact_start
est défini sur NULL
. Le drapeau 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 à l'état 'idle in transaction'
plutôt que 'idle'
. Et il se bloque peut-être un peu moins fréquemment depuis ce changement?
J'ai l'impression 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 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
puis close connection
.