No voy a entrar en el tema de si es un error de aplicación de base de datos, solo digamos que por algún motivo tienes un abrazo mortal o bloqueo mutuo en una base de datos, y es necesario ver quienes son los interlocutores (probablemente te des cuenta porque al menos uno de ellos te va a llamar) que intervienen en dicho abrazo mortal.
Esto se puede lograr utilizando la siguiente sintaxis:
select t.relname,l.locktype,page,virtualtransaction,pid,mode,granted,client_addr,datname
from pg_locks l, pg_stat_all_tables t, pg_stat_activity c
where l.relation=t.relid
and pid=c.procpid
order by relation asc;
Esto te mostrará una lista con todas las tablas bloqueadas y quien la está bloqueando. (Posteriormente trataré de ampliar la información mostrando los tipos de bloqueos)
Se pueden agregar variantes, por ejemplo de esta forma podemos limitar a una sola base de datos:
select t.relname,l.locktype,page,virtualtransaction,pid,mode,granted,client_addr,datname
from pg_locks l, pg_stat_all_tables t, pg_stat_activity c
where l.relation=t.relid
and pid=c.procpid
and datname='basedatos'
order by relation asc;
Incluso puedes listarlo especificamente para un cliente:
select t.relname,l.locktype,page,virtualtransaction,pid,mode,granted,client_addr,datname
from pg_locks l, pg_stat_all_tables t, pg_stat_activity c
where l.relation=t.relid
and pid=c.procpid
and datname='basedatos'
and client_addr='dir.ip'
order by relation asc;
No hay comentarios:
Publicar un comentario