43.32. pg_locks

La vue pg_locks fournit un accès aux informations concernant les verrous détenus par les transactions ouvertes à l'intérieur du serveur de bases de données. Voir le Chapitre 12 pour une discussion plus importante sur les verrous.

pg_locks contient une ligne par objet verrouillable actif, mode de verrouillage demandé et transaction indiquée. Donc, le même objet verrouillable pourrait apparaître plusieurs fois si plusieurs transactions ont pris ou attendent des verrous sur celui-ci. Néanmoins, un objet qui n'est pas verrouillé n'apparaîtra pas du tout. Un objet verrouillé est soit une relation (c'est-à-dire une table) soit un identifiant de transaction.

Notez que cette vue inclut seulement des verrous au niveau de la table, pas au niveau des lignes. Si une transaction attend un verrou ligne, il apparaîtra dans la vue en attente d'un identifiant de transaction du déteneur actuel du verrou.

Tableau 43-32. Colonnes pg_locks

NomTypeRéférencesDescription
relationoidpg_class.oid OID de la relation verrouillée ou NULL si l'objet verrouillé est un identifiant de transaction
databaseoidpg_database.oid OID de la base de données dans lequel la relation verrouillée existe ou zéro si la relation verrouillée est une table partagée globalement ou NULL si l'objet verrouillable est un identifiant de transaction
transactionxid  ID d'une transaction ou NULL si l'objet verrouillable est une relation
pidinteger Identifiant (PID) du processus serveur détenant ou attendant ce verrou
modetext Nom du mode de verrou détenu ou attendu par ce processus (voir la Section 12.3.1)
grantedboolean vrai si le verrou est détenu, faux s'il est attendu

granted est vrai sur une ligne représentant un verrou tenu par la session indiquée. Une valeur faux indique que cette session attend l'acquisition du verrou, ce qui implique qu'une autre session a choisi un mode de verrouillage conflictuel sur le même objet partageable. La session en attente dormira jusqu'à la relâche du verrou (ou jusqu'à ce qu'une situation de blocage soit détectée). Une session seule ne peut attendre d'acquérir qu'au plus un verrou à la fois.

Chaque transaction détient un verrou exclusif sur son identifiant de transaction durant toute la durée de son exécution. Si une transaction trouve nécessaire d'attendre spécifiquement une autre transaction, elle le fait en essayant d'acquérir un verrou partagé sur l'identifiant de l'autre transaction. Ceci sera couronné de succès seulement lorsque l'autre transaction termine et relâche son verrou.

Quand la vue pg_locks est accédée, les structures de données du gestionnaire interne de verrous sont momentanément verrouillées et une copie est faite pour que la vue s'affiche. Ceci nous assure que la vue produise un ensemble consistant de résultats, tout en ne bloquant pas les opérations habituelles du gestionnaire de verrous plus longuement que nécessaire. Néanmoins, il peut y avoir des impacts sur les performances de la base de données si cette vue est lue fréquemment.

pg_locks fournit une vue globale de tous les verrous du cluster de bases de données, et non pas seulement une vue de ceux de la base en cours. Bien que sa colonne relation puisse être jointe avec pg_class.oid pour identifier les relations verrouillées, ceci ne fonctionnera correctement qu'avec les relations de la base en cours (celles pour qui la colonne database est soit l'OID de la base en cours soit zéro).

Si vous avez activé le collecteur de statistiques, la colonne pid peut être jointe à la colonne procpid de la vue pg_stat_activity pour obtenir plus d'information sur le propriétaire de la session ou attendant de détenir le verrou.