行级锁 · 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。