我正在尝试找出某个事务锁定了什么,从而阻止其他查询执行。我像这样查询了 pg_locks:
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
返回了一堆像这样的结果
关系名称 | 锁型 | 数据库 | 关系 | 页 | 元组 | 虚拟XID | 交易编号 | 类标识 | 对象 | 对象 | 虚拟交易 | 进程号 | 模式 | 的确 | 快速路径 | 等待启动 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
无效的 | 目的 | 14035700 | 无效的 | 无效的 | 无效的 | 无效的 | 无效的 | 2606 | 14051522 | 0 | 4/431226 | 793556 | 访问排他锁 | 真的 | 错误的 | 无效的 |
relation
对于大多数(并非全部)结果, 为 NULL。对于这些, classid
和objid
为非空(如上例所示)。我如何将它们解析为有用的对象标识符?根据pg_locks 文档,锁“由类 OID 和对象 OID 标识,方式与 pg_description 中相同”。但是,当我查询pg_description时,我找不到这些 oid。那里的 objoid 列的值都在 20000 以下 - 没有像 805681436 这样的值。
编辑:根据 Laurenz Albe 的回答更新查询(谢谢!)
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