WAIT EVENT · LOCK重量级锁
Lockadvisory
等待获得一个建议用户锁。
Waiting to acquire an advisory user lock
重量级锁 引入 9.6(机制起点) 现存至 20 devel 0 次变动 动态触发图谱档案
版本轨迹
相对 PostgreSQL 17 无变化。
各版本描述
相邻版本里类型、名称与英文描述都相同的合并成一段,旧的在前。中文取自图谱或本站手册译文,没有译文的只给英文原文。
-
9.620
Lockadvisory等待获得一个建议用户锁。
Waiting to acquire an advisory user lock.
触发机制
PG_WAIT_LOCK 位于 src/backend/storage/lmgr/proc.c:1487,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:428。探针覆盖的操作是:等待获取用户 advisory lock。锁管理器无法立即授予 advisory 重量级锁;ProcSleep 报告等待,并把后端挂到该锁的等待队列,直到持有者释放或请求被取消。
PG_WAIT_LOCK at src/backend/storage/lmgr/proc.c:1487 is the grep-verified reporting path. The public identity/resource is mapped at src/backend/utils/activity/wait_event_names.txt:428. The instrumented operation is: Waiting to acquire an advisory user lock. The lock manager could not grant the advisory heavyweight lock immediately. ProcSleep reports the lock wait and parks the backend on the lock's wait queue until owners release or the request is cancelled.
通常正常
普通写入或计划内 DDL 的亚秒级锁交接可能正常。
Sub-second handoff during ordinary writes or planned DDL can be normal.
值得警惕
面向用户的等待超过延迟目标、阻塞链持续增长,或根持有者处于 idle in transaction 时,应当调查。
Investigate once a user-facing wait breaches its latency objective, a blocking chain grows, or the root holder is idle in transaction.
诊断 SQL
直接在 psql 里跑;标注的是语句里用到的视图与列所要求的最低版本。
正在等待 Lock/advisory 的会话Sessions waiting on Lock/advisory
PG ≥ 13SELECT pid, backend_type, usename, datname, application_name,
state, now() - query_start AS query_age,
now() - xact_start AS xact_age,
wait_event_type, wait_event,
pg_blocking_pids(pid) AS blocking_pids,
left(query, 160) AS query
FROM pg_stat_activity
WHERE wait_event_type = 'Lock'
AND wait_event = 'advisory'
ORDER BY query_age DESC NULLS LAST;
当前 Lock 等待分布Current Lock cohort
PG ≥ 13SELECT wait_event, count(*) AS waiting_sessions,
count(*) FILTER (WHERE state = 'active') AS active_waiters,
max(now() - query_start) AS oldest_query
FROM pg_stat_activity
WHERE wait_event_type = 'Lock'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文Lock and relation context for these sessions
PG ≥ 13SELECT a.pid, l.locktype, l.mode, l.granted, l.fastpath,
d.datname, n.nspname, c.relname,
l.page, l.tuple, l.virtualxid, l.transactionid,
l.classid, l.objid, l.objsubid
FROM pg_stat_activity AS a
LEFT JOIN pg_locks AS l ON l.pid = a.pid
LEFT JOIN pg_database AS d ON d.oid = l.database
LEFT JOIN pg_class AS c
ON c.oid = l.relation
AND l.database = (
SELECT oid FROM pg_database WHERE datname = current_database()
)
LEFT JOIN pg_namespace AS n ON n.oid = c.relnamespace
WHERE a.wait_event_type = 'Lock'
AND a.wait_event = 'advisory'
ORDER BY a.pid, l.granted, l.locktype, l.mode;
处置步骤
- 沿 pg_blocking_pids 构建到根节点的阻塞图。
- 检查根持有者状态、事务年龄与业务目的。
- 确认最安全的根动作后,再选择取消、超时或调整负载顺序。
英文原文
- Build the pg_blocking_pids graph to its root.
- Inspect the root holder's state, transaction age, and business purpose.
- Choose cancellation, timeout, or workload sequencing only after identifying the safest root action.
相关参数与指标
lock_timeoutdeadlock_timeout
waiting_sessionswait_event_shareblocked_sessionslocks_per_backend
源码证据
图谱在各版本源码树里核对到的位置,新的在前。「触发点」是真正上报等待事件的调用处,「目录定义」只说明这个名字在枚举里存在。
PostgreSQL 18REL_18_6
-
src/backend/utils/adt/lockfuncs.c:39advisory资源定义动态触发"advisory", -
src/backend/storage/lmgr/proc.c:1487PG_WAIT_LOCK通用上报动态触发PG_WAIT_LOCK | locallock->tag.lock.locktag_type); -
src/backend/utils/activity/wait_event_names.txt:428advisory目录定义动态触发advisory "Waiting to acquire an advisory user lock."
演化历史
相邻两个大版本之间的差异,新的在前。版本号链到该版的变动清单。
-
PostgreSQL 9.6 新增此事件
9.6 引入等待事件机制,此为本事件的首个版本
等待获得一个建议用户锁。
同类事件
| 事件 | 引入 | 版本变动 | 最近变动 |
|---|---|---|---|
advisory档案
|
9.6起点 | — | |
| 等待获取用户 advisory lock。 | 现存 | ||
applytransaction档案
|
16 | — | |
| 等待获取逻辑复制订阅端正在应用的远程事务上的锁。 | 现存 | ||
extend档案
|
9.6起点 | — | |
| 等待扩展 relation。 | 现存 | ||
frozenid档案
|
9.6起点 | — | |
| 等待更新 pg_database.datfrozenxid 和 pg_database.datminmxid。 | 现存 | ||
object档案
|
9.6起点 | — | |
| 等待获取非 relation 数据库对象上的锁。 | 现存 | ||
page档案
|
9.6起点 | 131 次 | |
| 等待获取 relation 页面上的锁。 | 现存 | ||
relation档案
|
9.6起点 | — | |
| 等待获取 relation 上的锁。 | 现存 | ||
spectoken档案
|
9.6起点 | 131 次 | |
等待获取推测式插入锁。曾用名 speculative token |
现存 | ||
transactionid档案
|
9.6起点 | — | |
| 等待事务结束。 | 现存 | ||
tuple档案
|
9.6起点 | — | |
| 等待获取 tuple 上的锁。 | 现存 | ||
userlock档案
|
9.6起点 | 101 次 | |
| 等待获取用户锁。 | 现存 | ||
virtualxid档案
|
9.6起点 | 173 次 | |
| 等待获取虚拟事务 ID 锁。 | 现存 | ||