↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

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

百科 / 锁百科 / 行级锁

行级锁 · FU

FOR UPDATE

行更新锁

FOR UPDATE 会导致 SELECT 语句检索到的行像将要被更新一样被锁定。这会阻止它们在当前事务结束之前被其他事务锁定、修改或删除。也就是说,其他尝试对这些行执行 UPDATE、DELETE、SELECT FOR UPDATE、SELECT FOR NO KEY UPDATE、SELECT FOR SHARE 或 SELECT FOR KEY SHARE 的事务,都会被阻塞直到当前事务结束。反过来,SELECT FOR UPDATE 也会等待已经在同一行上执行过上述任一命令的并发事务,并随后锁定并返回更新后的那一行(或者不返回任何行,因为该行可能已被删除)。不过,在 REPEATABLE READ 或 SERIALIZABLE 事务中,如果要锁定的行自事务开始以来已经发生变化,就会抛出错误。进一步讨论见第 13.4 节。 FOR UPDATE 锁模式也会被对某一行的任何 DELETE 获取,以及会修改某些列值的 UPDATE 获取。目前,就 UPDATE 而言,这里考虑的列是指其上存在可供外键使用的唯一索引的列(因此不考虑部分索引和表达式索引),但这在将来可能会变化。

当前稳定版

中文定义与说明

FOR UPDATE 会导致 SELECT 语句检索到的行像将要被更新一样被锁定。这会阻止它们在当前事务结束之前被其他事务锁定、修改或删除。也就是说,其他尝试对这些行执行 UPDATE、DELETE、SELECT FOR UPDATE、SELECT FOR NO KEY UPDATE、SELECT FOR SHARE 或 SELECT FOR KEY SHARE 的事务,都会被阻塞直到当前事务结束。反过来,SELECT FOR UPDATE 也会等待已经在同一行上执行过上述任一命令的并发事务,并随后锁定并返回更新后的那一行(或者不返回任何行,因为该行可能已被删除)。不过,在 REPEATABLE READ 或 SERIALIZABLE 事务中,如果要锁定的行自事务开始以来已经发生变化,就会抛出错误。进一步讨论见第 13.4 节。

FOR UPDATE 锁模式也会被对某一行的任何 DELETE 获取,以及会修改某些列值的 UPDATE 获取。目前,就 UPDATE 而言,这里考虑的列是指其上存在可供外键使用的唯一索引的列(因此不考虑部分索引和表达式索引),但这在将来可能会变化。

冲突关系

以下只比较不同事务在同一行上持有的锁。

与这些模式兼容 0

  • 与同一作用域的所有模式冲突。

纵轴是请求的锁,横轴是另一事务已经持有的锁;只比较同一对象。

取得此模式的命令

SQL 命令取得条件与说明
SELECT FOR UPDATE作用于实际选中的行;目标表同时取得 ROW SHARE。NOWAIT / SKIP LOCKED 改变等待行为,不改变锁冲突规则。
UPDATE(修改键值)修改可供外键引用的唯一索引列时使用;部分索引和表达式索引不算在内。
DELETE在被删除的已有行上取得此模式;目标表同时取得 ROW EXCLUSIVE。
MERGE … WHEN MATCHED THEN DELETE / UPDATE(键)实际删除或更新键列的匹配行;纯插入分支不适用。
INSERT … ON CONFLICT DO UPDATE(键)冲突路径修改键列时,锁住冲突的已有行;不是普通 INSERT 的固定行锁。

链接指向本站 PostgreSQL 18 的 SQL 命令百科。命令也可能取得其他锁,查看完整命令关联表。

其他锁模式

数据来源

当前查看 PostgreSQL 18,采样构建 REL_18_STABLE · 753057e340da。冲突关系与命令行为按该版本的文档和源码整理。命令链接进入本站 SQL 命令百科,并保留所选版本。

本站显式锁定手册 · 官方手册

查看采样源码与构建依据

资料核验日期:2026-09-27。