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
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
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
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
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 $550Esta guía es orientativa y usa comandos de referencia. En producción, adapta a tu versión y prueba en un ambiente seguro primero.