首页/数据/SQL 速查/NOWAIT / SKIP LOCKED 锁读策略
变更与事务52 条

NOWAIT / SKIP LOCKED 锁读策略

锁读的两个变体:NOWAIT 拿不到锁立刻报错,SKIP LOCKED 跳过被锁行——后者是队列消费场景的常用模式。

SQL 速查数据更新于 2026-10-12

示例

示例
-- 队列任务领取:多个 worker 并发不互相等待
BEGIN;
SELECT id FROM jobs
WHERE state = 'queued'
ORDER BY id
LIMIT 1
FOR UPDATE SKIP LOCKED;
-- ... 处理并更新 ...
COMMIT;
NOWAIT立即失败(MySQL 8.0.1+ / PostgreSQL 均支持)
SKIP LOCKED跳过锁定行,返回其余行
适用任务队列、批量分发;不适用于需要完整一致快照的统计

易错点

  • SKIP LOCKED 读到的是不完整视图,用在报表/对账会得到非一致结果,仅限“领取任务”类场景
  • 长时间持锁的 worker 会让 SKIP LOCKED 反复跳过同一批行造成饥饿,处理超时要回滚锁

数据来源与参考

  • MySQL 8.0 Reference Manual · Locking Reads
  • PostgreSQL Documentation · SELECT
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌