F.31. pgrowlocks — mostrar información de bloqueo de filas de una tabla #

F.31.1. Resumen
F.31.2. Ejemplo de salida
F.31.3. Autor

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.

F.31.1. Resumen #

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

NombreTipoDescripción
locked_rowtidIdentificador de tupla (TID) de la fila bloqueada
lockerxidID de transacción del bloqueador, o ID de multixact si es una multitransacción; consulta la Section 67.1
multibooleanVerdadero si el bloqueador es una multitransacción
xidsxid[]IDs de transacción de los bloqueadores (más de uno si es una multitransacción)
modestext[]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.
pidsinteger[]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:

  1. Si se toma un bloqueo de tipo ACCESS EXCLUSIVE en la tabla, pgrowlocks se bloqueará.

  2. 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.

F.31.2. Ejemplo de salida #

=# 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)

F.31.3. Autor #

Tatsuo Ishii