Comment détecter une requête qui détient le verrou dans Postgres?
Je souhaite suivre mutuelle verrous dans postgres constamment.
Je suis tombé sur Serrures De Surveillance article et essayé d'exécuter la requête suivante:
SELECT bl.pid AS blocked_pid,
a.usename AS blocked_user,
kl.pid AS blocking_pid,
ka.usename AS blocking_user,
a.query AS blocked_statement
FROM pg_catalog.pg_locks bl
JOIN pg_catalog.pg_stat_activity a ON a.pid = bl.pid
JOIN pg_catalog.pg_locks kl ON kl.transactionid = bl.transactionid AND kl.pid != bl.pid
JOIN pg_catalog.pg_stat_activity ka ON ka.pid = kl.pid
WHERE NOT bl.granted;
Malheureusement, il ne revient jamais non-jeu de résultats vide. Si je simplifie requête donnée à la forme suivante:
SELECT bl.pid AS blocked_pid,
a.usename AS blocked_user,
a.query AS blocked_statement
FROM pg_catalog.pg_locks bl
JOIN pg_catalog.pg_stat_activity a ON a.pid = bl.pid
WHERE NOT bl.granted;
ensuite, il retourne les requêtes qui sont en attente pour acquérir un verrou. Mais je n'arrive pas à le modifier de sorte qu'il peut renvoyer à la fois bloqué et bloquant les requêtes.
Des idées?
source d'informationauteur Roman
Vous devez vous connecter pour publier un commentaire.
Depuis 9.6 c'est beaucoup plus facile, car il introduit la fonction
pg_blocking_pids()
pour trouver les sessions qui sont de blocage d'une autre session.De sorte que vous pouvez utiliser quelque chose comme ceci:
De cette excellent article sur la requête de serrures dans Postgreson peut obtenir bloqué requête et bloqueur de requêtes et de leurs informations à partir de la requête suivante.
Que la requête est longue mais utile, l'article l'auteur a créé une vue pour simplifier son utilisation.
Une chose que je trouve qui est souvent absent de ces est la capacité à rechercher les verrous de ligne. Au moins sur la plus grande des bases de données, j'ai travaillé sur, les verrous de ligne ne sont pas affichés dans pg_locks (si elles l'étaient, pg_locks serait beaucoup, beaucoup plus grand et il n'y a pas un type de données real pour montrer le verrouillage de ligne dans ce point de vue correctement).
Je ne sais pas qu'il existe une solution simple à ce mais généralement ce que je fais est de regarder à la table où la serrure est en attente et de recherche pour les lignes où le xmax est moins de l'identifiant de transaction qui y sont présentes. Qui, habituellement, me donne un endroit pour commencer, mais il est un peu sur les mains et pas d'automatisation sympathique.
Note qui vous montre les écritures non validées sur les lignes de ces tableaux. Une fois validée, les lignes ne sont pas visibles dans l'instantané actuel. Mais pour les grandes tables, qui est une douleur.