行级锁 · FNKU
FOR NO KEY UPDATE
非键更新锁
其行为类似于 FOR UPDATE,但获取的锁较弱:这种锁不会阻塞试图在同一行上获取锁的 SELECT FOR KEY SHARE 命令。凡是不会获得 FOR UPDATE 锁的 UPDATE,都会获得这种锁模式。
中文定义与说明
其行为类似于 FOR UPDATE,但获取的锁较弱:这种锁不会阻塞试图在同一行上获取锁的
SELECT FOR KEY SHARE 命令。凡是不会获得 FOR UPDATE
锁的 UPDATE,都会获得这种锁模式。
冲突关系
以下只比较不同事务在同一行上持有的锁。
与这些模式冲突 3
与这些模式兼容 1
纵轴是请求的锁,横轴是另一事务已经持有的锁;只比较同一对象。
取得此模式的命令
| SQL 命令 | 取得条件与说明 |
|---|---|
| SELECT FOR NO KEY UPDATE | 作用于实际选中的行;目标表同时取得 ROW SHARE。NOWAIT / SKIP LOCKED 改变等待行为,不改变锁冲突规则。 |
| UPDATE(不修改键值) | 没有取得 FOR UPDATE 的 UPDATE 使用此模式。此处的键列是可供外键引用的唯一索引列,不包括部分索引与表达式索引。 |
| MERGE … WHEN MATCHED THEN UPDATE(非键) | 实际执行 UPDATE 分支且不需 FOR UPDATE 时;不能给所有 MERGE 分支统一套用一种行锁。 |
| INSERT … ON CONFLICT DO UPDATE(非键) | 冲突路径锁住要更新的已有行;锁强度按 UPDATE 的键列规则确定,即使 DO UPDATE WHERE 排除更新也会锁行。 |
链接指向本站 PostgreSQL 18 的 SQL 命令百科。命令也可能取得其他锁,查看完整命令关联表。
其他锁模式
数据来源
当前查看 PostgreSQL 18,采样构建 REL_18_STABLE · 753057e340da。冲突关系与命令行为按该版本的文档和源码整理。命令链接进入本站 SQL 命令百科,并保留所选版本。
资料核验日期:2026-09-27。