选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

文档 / 等待事件 / 重量级锁

WAIT EVENT · LOCK重量级锁

Lockspectoken

等待获取推测的插入锁。

Waiting to acquire a speculative insertion lock

重量级锁 引入 9.6(机制起点) 现存至 20 devel 1 次变动 动态触发图谱档案

类型
重量级锁
引入版本
9.6(机制起点)
版本状态
当前稳定版
覆盖版本
12 个 · 9.6 – 20
触发路径
动态触发
实测发行版
18.6
名称变动
曾用名 speculative token
手册章节
监控统计

PostgreSQL 18 手册 官方文档 源码 wait.pg.center

版本轨迹

相对 PostgreSQL 17 无变化。

各版本描述

相邻版本里类型、名称与英文描述都相同的合并成一段,旧的在前。中文取自图谱或本站手册译文,没有译文的只给英文原文。

  1. 9.612

    Lockspeculative token曾用名

    等待获取推测的插入锁。

    Waiting to acquire a speculative insertion lock.

  2. 1320

    Lockspectoken

    等待获取推测的插入锁。

    Waiting to acquire a speculative insertion lock.

触发机制

PG_WAIT_LOCK 位于 src/backend/storage/lmgr/proc.c:1487,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:425。探针覆盖的操作是:等待获取推测式插入锁。锁管理器无法立即授予 spectoken 重量级锁;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:425. The instrumented operation is: Waiting to acquire a speculative insertion lock. The lock manager could not grant the spectoken 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/spectoken 的会话Sessions waiting on Lock/spectoken

PG ≥ 13
SELECT 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 = 'spectoken'
ORDER BY query_age DESC NULLS LAST;

当前 Lock 等待分布Current Lock cohort

PG ≥ 13
SELECT 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 ≥ 13
SELECT 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 = 'spectoken'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置步骤

  1. 沿 pg_blocking_pids 构建到根节点的阻塞图。
  2. 检查根持有者状态、事务年龄与业务目的。
  3. 确认最安全的根动作后,再选择取消、超时或调整负载顺序。
英文原文
  1. Build the pg_blocking_pids graph to its root.
  2. Inspect the root holder's state, transaction age, and business purpose.
  3. 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

演化历史

相邻两个大版本之间的差异,新的在前。版本号链到该版的变动清单。

  1. PostgreSQL 13 ← 12 更名

    更名 speculative tokenspectoken

    等待获取推测的插入锁。

  2. PostgreSQL 9.6 新增此事件

    9.6 引入等待事件机制,此为本事件的首个版本

    等待获取推测的插入锁。

同类事件

事件 引入 版本变动 最近变动
LOCK 重量级锁 12 个
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 锁。 现存