PostgreSQL 如何用 pg_locks 查询当前所有锁信息-SQL

pg_locks视图返回当前正在持有或等待的锁状态快照,每行表示一个backend进程与锁对象(表、行、事务ID等)的关联关系;需联查pg_stat_activity才能获取进程和SQL信息。

pg_locks 视图返回的是什么数据

pg_locks 是 PostgreSQL 内置的系统视图,它不存储锁的历史记录,只反映当前**正在持有或等待中**的锁状态。每一行代表一个锁对象(如表、行、事务ID等)与一个进程(pid)之间的关联关系。注意:它不是“谁锁了谁”的直观映射,而是“某个 backend 持有/等待某类锁”的快照。

如何查出带进程和 SQL 的完整锁信息

单独查 pg_locks 几乎没用,必须关联 pg_stat_activity 才能知道哪个会话在执行什么 SQL。常用组合查询如下:

SELECT 
  l.pid,
  a.usename,
  a.application_name,
  a.client_addr,
  l.mode,
  l.granted,
  l.locktype,
  l.relation::regclass AS table_name,
  l.page,
  l.tuple,
  a.state,
  a.query
FROM pg_locks l
JOIN pg_stat_activity a ON l.pid = a.pid
WHERE a.pid  pg_backend_pid();

关键点:

  • l.granted = false 表示该进程正在等待锁(可能被阻塞)
  • l.locktype = 'relation' 对应表级锁,'tuple' 对应行级锁(需结合 page 和 tuple 定位)
  • a.state = 'active' 或 'idle in transaction' 的会话更值得关注
  • 过滤掉 pg_backend_pid() 是为了避免查到当前查询自身的锁(除非你故意要查)

为什么看不到行锁的具体 WHERE 条件

pg_locks 不保存 SQL 的谓词条件,它只记录锁作用的对象(比如第 5 页第 12 行),无法反推出 “WHERE id = 100” 这样的逻辑。如果你看到 locktype = 'tuple',只能确认有行锁存在,但具体锁了哪几行,得结合 query 字段里的 SQL + 表结构 + 当前事务的隔离级别来推理。

常见误区:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » PostgreSQL 如何用 pg_locks 查询当前所有锁信息-SQL
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4008627+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4008627+
  • 本周更新: 0+
  • 最后更新: 2026-03-16