PostgreSQLLa base de données la plus sophistiquée au monde.

42.37. 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, Contrôle d'accès simultané 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.

Il existe plusieurs types distincts d'objets verrouillables : des relations complètes (par exemple les tables), des pages individuelles de relations, des lignes individuelles de relations, des identifiants de transaction et des objets généraux de la base de données (identifiés par l'OID de la classe et l'OID de l'objet, de la même façon que dans pg_description ou pg_depend). De plus, le droit d'étendre une relation est représenté comme un objet verrouillable séparé.

Tableau 42.37. Colonnes pg_locks

Nom Type Références Description
locktype text   type de l'objet verrouillable : relation, extend, page, tuple, transactionid, object ou userlock
database oid pg_database.oid l'OID de la base de données dans laquelle existe l'objet, ou zéro si l'objet est partagé, ou NULL si l'objet est un identifiant de transaction
relation oid pg_class.oid l'OID de la relation, ou NULL si l'objet n'est pas une relation ou ne fait pas partie d'une relation
page integer   le numéro de page à l'intérieur de cette relation, ou NULL si l'objet n'est pas une ligne ou une page de la relation
tuple smallint   le numéro de ligne dans la page, ou NULL si l'objet n'est pas une ligne
transactionid xid   l'identifiant d'une transaction, ou NULL si l'objet n'est pas un identifiant de transaction
classid oid pg_class.oid l'OID du catalogue système contenant l'objet, ou NULL si l'objet n'est pas un objet général de la base de données
objid oid any OID column l'OID de l'objet dans son catalogue système, ou NULL si l'objet n'est pas un objet général de la base de données
objsubid smallint   pour la colonne d'une table, ceci est le numéro de la colonne (classid et objid font référence à la table elle-même). Pour tous les autres types d'objets, cette colonne vaut zéro. NULL si l'objet n'est pas un objet général de la base de données.
transaction xid   l'ID de la transaction qui détient ou attend ce verrou.
pid integer   l'identifiant du processus serveur détenant ou attendant le verrou. NULL si le verrou est possédé par une transaction préparée.
mode text   Nom du mode de verrou détenu ou attendu par ce processus (voir la Section 12.3.1, « Verrous de niveau table »)
granted boolean   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 transaction indiquée. Une valeur faux indique que cette transaction attend l'acquisition du verrou, ce qui implique qu'une autre transaction a choisi un mode de verrouillage conflictuel sur le même objet partageable. La transaction en attente dormira jusqu'à la relâche du verrou (ou jusqu'à ce qu'une situation de blocage soit détectée). Une transaction seule peut attendre d'acquérir 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.

Bien que les lignes sont un type d'objet verrouillable, les informations sur les verroux au niveau ligne sont stockées sur disque, et non pas en mémoire. Du coup, les verroux niveau ligne n'apparaissent normalement pas dans cette vue. Si une transaction est en attente d'un verrou niveau ligne, cela apparaîtra sur la vue comme en attente de l'identifiant de la transaction du déteneur actuel du verrou de cette ligne.

Si les verroux définis par l'utilisateur sont utilisés, ils sont affichés en utilisant les colonnes des objets généraux de la base de données. Néanmoins, la signification réelle des champs verrou dans de tels cas concerne l'utilisateur.

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. De plus, si vous utilisez les transactions préparées, la colonne transaction peut être jointe à la colonne transaction de la vue pg_prepared_xacts pour obtenir plus d'informations sur les transactions préparées qui détiennent les verroux. (Une transaction préparée ne peut jamais être en attente d'un verrou mais elle continue à détenir les verroux qu'elle a acquis pendant son exécution.)