Estou tentando descobrir o que uma transação específica está bloqueando que impede outras consultas de executar. Eu consultei pg_locks assim:
select c.relname, l.*
from pg_locks l
join pg_database d on l.database = d.oid
left join pg_class c on l.relation = c.oid
where d.datname = 'MYDB' and pid = MYPID
Isso retornou um monte de resultados como este
renomear | tipo de fechadura | banco de dados | relação | página | tupla | xid virtual | ID da transação | classid | objeto | objetosubid | transação virtual | pid | modo | garantido | caminho rápido | esperainiciar |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
NULO | objeto | 14035700 | NULO | NULO | NULO | NULO | NULO | 2606 | 14051522 | 0 | 4/431226 | 793556 | AcessoExclusivoBloqueio | verdadeiro | falso | NULO |
relation
era NULL para a maioria (não todos) dos resultados. Para estes, classid
e objid
eram não nulos (como no exemplo acima). Como resolvo isso para identificadores de objeto úteis? De acordo com a documentação do pg_locks, os bloqueios são "identificados por OID de classe e OID de objeto, da mesma forma que em pg_description". Quando consulto pg_description , no entanto, não consigo encontrar esses oids. Os valores da coluna objoid estão todos abaixo de 20000 - não há nada como 805681436.
Edição: consulta atualizada com base na resposta de Laurenz Albe (obrigado!)
select l.granted, l.locktype, l.mode, l.classid, l.objid, l.classid::regclass
, c.relname, cns.conname -- relation
, cns.conrelid::regclass as constraint_table, cns.contype -- constraint
, trg.tgrelid::regclass as trigger_table, trg.tgname -- trigger
from pg_locks l
join pg_database d on l.database = d.oid
left join pg_class c on l.relation = c.oid
left join pg_constraint cns on l.objid = cns.oid and l.classid::regclass = 'pg_constraint'::regclass
left join pg_trigger trg on l.objid = trg.oid and l.classid::regclass = 'pg_trigger'::regclass
where d.datname = 'MYDB' and pid = MYPID