Saltar al contenido
DBAExperts
PostgreSQL Diagnóstico

Cómo ver y resolver bloqueos en PostgreSQL con pg_locks y pg_stat_activity

Un bloqueo aparece cuando una transacción espera un recurso que otra retiene. La clave es identificar qué sesión bloquea a cuál antes de decidir si conviene esperar o cancelarla.

  1. 1

    Mira las sesiones activas y las que esperan

    pg_stat_activity muestra el estado de cada conexión. Las filas con wait_event_type = Lock están esperando un candado.

    SELECT pid, state, wait_event_type, wait_event, query
    FROM pg_stat_activity
    WHERE state <> 'idle';
  2. 2

    Identifica quién bloquea a quién

    La función pg_blocking_pids devuelve los procesos que retienen el candado que otra sesión espera. Es la forma directa de ver la cadena de bloqueo.

    SELECT pid, pg_blocking_pids(pid) AS bloqueado_por, query
    FROM pg_stat_activity
    WHERE cardinality(pg_blocking_pids(pid)) > 0;
  3. 3

    Cancela la consulta que bloquea (opción suave)

    pg_cancel_backend intenta abortar la consulta en curso sin cerrar la conexión. Es la primera opción, menos agresiva.

    SELECT pg_cancel_backend(12345);
  4. 4

    Termina la sesión si el cancel no basta

    pg_terminate_backend cierra la conexión completa. Úsalo con cuidado: la transacción en curso se revierte y la aplicación verá un error de conexión.

    SELECT pg_terminate_backend(12345);

// el error común

Matar el PID equivocado con pg_terminate_backend puede tirar una transacción legítima y provocar más daño que el bloqueo original. Confirma con pg_blocking_pids cuál es realmente el proceso que retiene el candado.

// cuándo conviene un experto

Si los bloqueos son recurrentes suelen ser un síntoma: transacciones largas, orden inconsistente de actualización o falta de índices. En dba.mx encontramos la causa raíz para que dejen de aparecer, no solo apagamos el incendio del momento.

Agenda un Escaneo — desde USD $550

Esta guía es orientativa y usa comandos de referencia. En producción, adapta a tu versión y prueba en un ambiente seguro primero.