El módulo pgrowlocks proporciona una función para mostrar
información de bloqueo de filas para una tabla especificada.
Por defecto, el uso está restringido a los superusuarios, a los roles con privilegios del
rol pg_stat_scan_tables y a los usuarios con permisos
de tipo SELECT en la tabla.
pgrowlocks(text) returns setof record
El parámetro es el nombre de una tabla. El resultado es un conjunto de registros, con una fila por cada fila bloqueada dentro de la tabla. Las columnas de salida se muestran en la Table F.21.
Table F.21. Columnas de salida de pgrowlocks
| Nombre | Tipo | Descripción |
|---|---|---|
locked_row | tid | Identificador de tupla (TID) de la fila bloqueada |
locker | xid | ID de transacción del bloqueador, o ID de multixact si es una multitransacción; consulta la Section 67.1 |
multi | boolean | Verdadero si el bloqueador es una multitransacción |
xids | xid[] | IDs de transacción de los bloqueadores (más de uno si es una multitransacción) |
modes | text[] | Modo de bloqueo de los bloqueadores (más de uno si es una multitransacción),
un array de For Key Share, For Share,
For No Key Update, No Key Update,
For Update, Update. |
pids | integer[] | IDs de proceso de los backends bloqueadores (más de uno si es una multitransacción) |
pgrowlocks toma un bloqueo de tipo AccessShareLock para la
tabla de destino y lee cada fila una por una para recopilar la información de bloqueo
de filas. Esto no es muy rápido para una tabla grande. Ten en cuenta que:
Si se toma un bloqueo de tipo ACCESS EXCLUSIVE en la tabla,
pgrowlocks se bloqueará.
No se garantiza que pgrowlocks produzca una
instantánea autoconsistente. Es posible que se tome un nuevo bloqueo de fila,
o se libere un bloqueo antiguo, durante su ejecución.
pgrowlocks no muestra el contenido de las filas
bloqueadas. Si deseas ver el contenido de las filas al mismo tiempo,
podrías hacer algo como esto:
SELECT * FROM accounts AS a, pgrowlocks('accounts') AS p
WHERE p.locked_row = a.ctid;
Ten en cuenta, sin embargo, que tal consulta será muy ineficiente.
=# 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