Le module pgrowlocks
fournit une fonction pour afficher
les informations de verrouillage de lignes pour une table spécifiée.
Par défaut, l'utilisation est restreinte aux superutilisateurs, aux rôles
disposant des droits du rôle pg_stat_scan_tables
, ainsi que
les utilisateurs avec le droit SELECT
sur la table.
pgrowlocks(text) returns setof record
Le paramètre est le nom d'une table. Le résultat est un ensemble d'enregistrements, avec une ligne pour chaque ligne verrouillée dans la table. Les colonnes en sortie sont affichées dans Tableau F.21.
Tableau F.21. Colonnes de pgrowlocks
Nom | Type | Description |
---|---|---|
locked_row | tid | ID de ligne (TID) d'une ligne verrouillée |
locker | xid | ID de transaction de la pose du verrou, ou ID multixact dans le cas d'une multi-transaction ; voir Section 74.1 |
multi | boolean | True si le verrou est détenu par une multi-transaction |
xids | xid[] | ID de transaction détenant les verrous (plus d'une en cas de multi-transaction) |
modes | text[] | Mode de verrouillage des verrous (plus d'un dans le cas d'une
multi-transaction), un tableau de Key Share ,
Share , For No Key Update ,
No Key Update , For Update ,
Update . |
pids | integer[] | ID de processus des serveurs ayant posé les verrous (plus d'une en cas de multi-transaction) |
pgrowlocks
prend un verrou
AccessShareLock
pour la table cible et lit chaque ligne
une par une pour récupérer les informations de verrouillage de lignes.
Ce n'est pas très rapide pour une grosse table. Notez que :
Si un verrou de type ACCESS EXCLUSIVE
est posée sur la
table, pgrowlocks
sera bloqué.
pgrowlocks
ne garantit pas de produire une image
cohérente. Il est possible qu'un nouveau verrou de ligne soit pris ou
qu'un ancien verrou soit libéré pendant son exécution.
pgrowlocks
ne montre pas le contenu des lignes
verrouillées. Si vous voulez jeter un œil au contenu de la ligne en même
temps, vous pouvez le faire ainsi :
SELECT * FROM accounts AS a, pgrowlocks('accounts') AS p WHERE p.locked_row = a.ctid;
Mais soyez conscient qu'une telle requête sera particulièrement inefficace.
=# SELECT * FROM pgrowlocks('t1'); locked_row | locker | multi | xids | modes | pids ------------+--------+-------+-------+----------------+-------- (0,1) | 609 | f | {609} | {"For Share"} | {3161} (0,2) | 609 | f | {609} | {"For Share"} | {3161} (0,3) | 607 | f | {607} | {"For Update"} | {3107} (0,4) | 607 | f | {607} | {"For Update"} | {3107} (4 rows)
Tatsuo Ishii