普通读取取得的表级锁;只与访问排他锁冲突。
SELECTCOPY … TOLOCK TABLE … IN ACCESS SHARE MODEALTER TABLE … NO INHERIT(父表)
pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
文档 / 锁百科
一条 SQL 会取得哪些锁,又会与谁互相阻塞?这里汇集 8 种表级锁模式与 4 种行级锁模式,按版本查看冲突关系,并关联取得这些锁的 SQL 命令。锁模式与 等待事件 是理解同一次等待的不同视角。
选择命令后,矩阵边缘和模式列表会标出它关联的锁;实际取得的锁仍取决于命令选项与执行阶段。
纵轴是请求的锁,横轴是另一事务已经持有的锁。只比较同一个表上的锁模式;名称中的 ROW 并不表示它是行级锁。
| 已持有 →请求 ↓ | AS | RS | RX | SUE | S | SRX | X | AX |
|---|---|---|---|---|---|---|---|---|
| ACCESS SHARE | ||||||||
| ROW SHARE | ||||||||
| ROW EXCLUSIVE | ||||||||
| SHARE UPDATE EXCLUSIVE | ||||||||
| SHARE | ||||||||
| SHARE ROW EXCLUSIVE | ||||||||
| EXCLUSIVE | ||||||||
| ACCESS EXCLUSIVE |
选择方格,查看请求的锁与已持有的锁能否共存。键盘方向键可在矩阵中移动。
按操作同时取得的表锁,对行锁组合分组:ROW SHARE 下展开四种 SELECT … FOR 组合,ROW EXCLUSIVE 下展开修改行的两种组合。共 14 个比较项,包含 8 个「仅表锁」项和 6 个「表锁 + 行锁」组合,仍然只有 12 种锁模式。
| 已持有 →请求 ↓ | AS | ROW SHARE | ROW EXCLUSIVE | SUE | S | SRX | X | AX | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 仅表锁 | 仅表锁 | FKS | FS | FNKU | FU | 仅表锁 | FNKU | FU | 仅表锁 | 仅表锁 | 仅表锁 | 仅表锁 | 仅表锁 | |
| ACCESS SHARE仅表锁 | ||||||||||||||
| ROW SHARE仅表锁 | ||||||||||||||
| FOR KEY SHARE | ||||||||||||||
| FOR SHARE | ||||||||||||||
| FOR NO KEY UPDATE | ||||||||||||||
| FOR UPDATE | ||||||||||||||
| ROW EXCLUSIVE仅表锁 | ||||||||||||||
| FOR NO KEY UPDATE | ||||||||||||||
| FOR UPDATE | ||||||||||||||
| SHARE UPDATE EXCLUSIVE仅表锁 | ||||||||||||||
| SHARE仅表锁 | ||||||||||||||
| SHARE ROW EXCLUSIVE仅表锁 | ||||||||||||||
| EXCLUSIVE仅表锁 | ||||||||||||||
| ACCESS EXCLUSIVE仅表锁 | ||||||||||||||
选择方格,查看请求的锁与已持有的锁能否共存。键盘方向键可在矩阵中移动。
缩进子项表示同时取得组头的表锁与所列行锁。分组表示常见的共同取得方式,不是锁强度的线性排序;SHARE UPDATE EXCLUSIVE 是独立的表锁模式。
矩阵假设两边操作同一张表。红色 × 表示表锁冲突,即使命中不同行也不能共存;琥珀色 ● 仅在命中同一行时冲突,命中不同行时这些锁模式可以共存。
缩写:AS ACCESS SHARE · RS ROW SHARE · RX ROW EXCLUSIVE · SUE SHARE UPDATE EXCLUSIVE · S SHARE · SRX SHARE ROW EXCLUSIVE · X EXCLUSIVE · AX ACCESS EXCLUSIVE · FKS FOR KEY SHARE · FS FOR SHARE · FNKU FOR NO KEY UPDATE · FU FOR UPDATE
表级锁保护整个关系;行级锁协调对同一行的修改和锁定。下表中的命令是常见取得方式,具体条件见「命令与锁」。
普通读取取得的表级锁;只与访问排他锁冲突。
SELECTCOPY … TOLOCK TABLE … IN ACCESS SHARE MODEALTER TABLE … NO INHERIT(父表)
带行锁子句的查询在目标表上取得的表级锁;名字中的 ROW 不表示行级锁。
SELECT FOR KEY SHARESELECT FOR SHARESELECT FOR NO KEY UPDATESELECT FOR UPDATEINSERT(外键检查)UPDATE(外键检查)COPY … FROM(外键检查)MERGE(外键检查)LOCK TABLE … IN ROW SHARE MODEALTER TABLE … VALIDATE CONSTRAINT(外键被引用表)
插入、更新和删除在目标表上取得的表级锁;多个事务可以同时持有。
INSERTUPDATEDELETECOPY … FROMMERGELOCK TABLE … IN ROW EXCLUSIVE MODEUPDATE(不修改键值)UPDATE(修改键值)MERGE … WHEN MATCHED THEN UPDATE(非键)MERGE … WHEN MATCHED THEN DELETE / UPDATE(键)INSERT … ON CONFLICT DO UPDATE(非键)INSERT … ON CONFLICT DO UPDATE(键)INSERT(外键检查)UPDATE(外键检查)COPY … FROM(外键检查)MERGE(外键检查)
用于维护及部分结构变更;允许普通读写,但同一表上不能同时执行另一项持有此模式的操作。
VACUUM(不含 FULL)ANALYZECREATE INDEX CONCURRENTLYCREATE STATISTICSCOMMENT ON(关系对象)DROP INDEX CONCURRENTLYREINDEX … CONCURRENTLYLOCK TABLE … IN SHARE UPDATE EXCLUSIVE MODEALTER TABLE … ALTER COLUMN … SET STATISTICSALTER TABLE … ALTER COLUMN … SET (n_distinct = …)ALTER TABLE … CLUSTER ONALTER TABLE … SET WITHOUT CLUSTERALTER TABLE … VALIDATE CONSTRAINTALTER TABLE … ATTACH PARTITION(父表)ALTER TABLE … DETACH PARTITION … FINALIZE(父表)ALTER TABLE … SET / RESET (fillfactor = …)ALTER TABLE … SET / RESET (autovacuum_* = …)ALTER TABLE … SET / RESET (toast.autovacuum_* = …)ALTER TABLE … DETACH PARTITION … CONCURRENTLY(父表)ALTER TABLE … DETACH PARTITION … CONCURRENTLY(分区,第一阶段)ALTER INDEX … RENAMEALTER TABLE … INHERIT(父表)
允许读取和另一项共享锁操作,阻止对目标表的数据修改。
CREATE INDEX(不含 CONCURRENTLY)REINDEX(所属表)LOCK TABLE … IN SHARE MODE
阻止普通数据修改,并与自身冲突;常见于创建触发器与增加外键。
CREATE TRIGGERLOCK TABLE … IN SHARE ROW EXCLUSIVE MODEALTER TABLE … ENABLE / DISABLE TRIGGERALTER TABLE … ADD FOREIGN KEY [NOT VALID](引用表)ALTER TABLE … ADD FOREIGN KEY [NOT VALID](被引用表)
只允许并发取得访问共享锁;普通读取仍可继续,带行锁的查询与写入需要等待。
REFRESH MATERIALIZED VIEW CONCURRENTLYLOCK TABLE … IN EXCLUSIVE MODE
与全部表级锁模式冲突;也是唯一会阻塞普通 SELECT 的表级锁。
REFRESH MATERIALIZED VIEW(不含 CONCURRENTLY)DROP TABLEDROP INDEX(不含 CONCURRENTLY)TRUNCATECLUSTERVACUUM FULLVACUUM(截断表尾阶段)REINDEX(被重建索引)LOCK TABLE … IN ACCESS EXCLUSIVE MODEALTER TABLE … ADD COLUMNALTER TABLE … DROP COLUMNALTER TABLE … ALTER COLUMN … SET / DROP DEFAULTALTER TABLE … ALTER COLUMN … TYPEALTER TABLE … ALTER COLUMN … SET STORAGEALTER TABLE … ALTER COLUMN … SET COMPRESSIONALTER TABLE … SET TABLESPACEALTER TABLE … SET LOGGED / UNLOGGEDALTER TABLE … SET ACCESS METHODALTER TABLE … DROP CONSTRAINTALTER TABLE … ALTER CONSTRAINTALTER TABLE … ALTER COLUMN … SET NOT NULLALTER TABLE … ALTER COLUMN … DROP NOT NULLALTER TABLE … ENABLE / DISABLE RULEALTER TABLE … ENABLE / DISABLE ROW LEVEL SECURITYALTER TABLE … FORCE / NO FORCE ROW LEVEL SECURITYALTER TABLE … ALTER COLUMN … DROP EXPRESSIONALTER TABLE … ALTER COLUMN … SET EXPRESSIONALTER TABLE … ALTER COLUMN … SET GENERATED / RESTART / SET sequence_optionALTER TABLE … ALTER COLUMN … ADD GENERATED … AS IDENTITYALTER TABLE … ALTER COLUMN … DROP IDENTITYALTER TABLE … INHERIT / NO INHERIT(子表)ALTER TABLE … OWNER TOALTER TABLE … REPLICA IDENTITYALTER TABLE … RENAMEALTER TABLE … ADD CONSTRAINT(CHECK / UNIQUE / PRIMARY KEY / EXCLUDE)ALTER TABLE … ATTACH PARTITION(待挂载分区)ALTER TABLE … ATTACH PARTITION(默认分区)ALTER TABLE … DETACH PARTITION(父表)ALTER TABLE … DETACH PARTITION(被分离分区)ALTER TABLE … DETACH PARTITION … CONCURRENTLY(分区,完成阶段)ALTER INDEX … SET TABLESPACEALTER INDEX … SET / RESET (fillfactor = …)ALTER INDEX … ATTACH PARTITION
保护同一行的键值;阻止删除和修改键值,允许不修改键值的更新。
SELECT FOR KEY SHAREINSERT(外键检查)UPDATE(外键检查)COPY … FROM(外键检查)MERGE(外键检查)
阻止同一行的更新、删除及排他行锁;允许其他事务共享锁定这一行。
用于不修改键值的更新;与键共享锁兼容,与其余行锁模式冲突。
SELECT FOR NO KEY UPDATEUPDATE(不修改键值)MERGE … WHEN MATCHED THEN UPDATE(非键)INSERT … ON CONFLICT DO UPDATE(非键)
最强的行锁模式;与同一行的全部行锁模式冲突,用于删除和可能修改键值的更新。
SELECT FOR UPDATEUPDATE(修改键值)DELETEMERGE … WHEN MATCHED THEN DELETE / UPDATE(键)INSERT … ON CONFLICT DO UPDATE(键)
同一命令可能因选项、对象或执行阶段取得不同模式。表中保留这些条件;点击命令可查看 PostgreSQL 18 的完整语法。
共 120 条命令及变体
| SQL 命令 | 关联的锁模式 | 取得条件与说明 |
|---|---|---|
| SELECT | 读取所引用的表;未使用 FOR … 行锁子句的表取得此模式。 | |
| COPY … TO | 从源表读取;COPY (query) TO 则取决于该查询。 | |
| LOCK TABLE … IN ACCESS SHARE MODE | 显式请求此表级模式;省略 IN … MODE 时默认为 ACCESS EXCLUSIVE。 | |
| ALTER TABLE … NO INHERIT(父表) | 检查并解除继承关系时,在父表上取得 ACCESS SHARE;被修改的子表另取 ACCESS EXCLUSIVE。 | |
| SELECT FOR KEY SHARE | 此模式锁住指定的表;同时在选中的行上取得对应的行锁。 | |
| SELECT FOR SHARE | 此模式锁住指定的表;同时在选中的行上取得对应的行锁。 | |
| SELECT FOR NO KEY UPDATE | 此模式锁住指定的表;同时在选中的行上取得对应的行锁。 | |
| SELECT FOR UPDATE | 此模式锁住指定的表;同时在选中的行上取得对应的行锁。 | |
| INSERT(外键检查) | 外键检查的内部 SELECT … FOR KEY SHARE 在被引用表上取得 ROW SHARE;写入目标表上的模式仍是 ROW EXCLUSIVE。 | |
| UPDATE(外键检查) | 外键检查的内部 SELECT … FOR KEY SHARE 在被引用表上取得 ROW SHARE;写入目标表上的模式仍是 ROW EXCLUSIVE。 | |
| COPY … FROM(外键检查) | 外键检查的内部 SELECT … FOR KEY SHARE 在被引用表上取得 ROW SHARE;写入目标表上的模式仍是 ROW EXCLUSIVE。 | |
| MERGE(外键检查) | 外键检查的内部 SELECT … FOR KEY SHARE 在被引用表上取得 ROW SHARE;写入目标表上的模式仍是 ROW EXCLUSIVE。 | |
| LOCK TABLE … IN ROW SHARE MODE | 显式请求此表级模式;省略 IN … MODE 时默认为 ACCESS EXCLUSIVE。 | |
| ALTER TABLE … VALIDATE CONSTRAINT(外键被引用表) | 验证外键时,被引用表另取 ROW SHARE;正在验证约束的表取 SHARE UPDATE EXCLUSIVE。 | |
| INSERT | 在写入的目标表上加锁;新插入行不能简单等同于对已有行取得 FOR UPDATE。 | |
| UPDATE | 目标表取得此模式;受影响的已有行另有行锁。 | |
| DELETE | 目标表取得此模式;删除的已有行另有 FOR UPDATE 行锁。 | |
| COPY … FROM | 在目标表上加锁并插入新行;不笼统列为对已有行取得 FOR UPDATE。 | |
| MERGE | 目标表取得此模式;每个匹配分支是否加行锁以及锁强度由实际 INSERT / UPDATE / DELETE 动作决定。 | |
| LOCK TABLE … IN ROW EXCLUSIVE MODE | 显式请求此表级模式;省略 IN … MODE 时默认为 ACCESS EXCLUSIVE。 | |
| UPDATE(不修改键值) | 这个写入变体在目标表上取得 ROW EXCLUSIVE;对已有行的锁另按实际动作取得。 | |
| UPDATE(修改键值) | 这个写入变体在目标表上取得 ROW EXCLUSIVE;对已有行的锁另按实际动作取得。 | |
| MERGE … WHEN MATCHED THEN UPDATE(非键) | 这个写入变体在目标表上取得 ROW EXCLUSIVE;对已有行的锁另按实际动作取得。 | |
| MERGE … WHEN MATCHED THEN DELETE / UPDATE(键) | 这个写入变体在目标表上取得 ROW EXCLUSIVE;对已有行的锁另按实际动作取得。 | |
| INSERT … ON CONFLICT DO UPDATE(非键) | 这个写入变体在目标表上取得 ROW EXCLUSIVE;对已有行的锁另按实际动作取得。 | |
| INSERT … ON CONFLICT DO UPDATE(键) | 这个写入变体在目标表上取得 ROW EXCLUSIVE;对已有行的锁另按实际动作取得。 | |
| INSERT(外键检查) | 原始写入命令在写入目标表上取得 ROW EXCLUSIVE;外键检查的 ROW SHARE 与 FOR KEY SHARE 则作用于被引用的表和行,不能混为同一对象。 | |
| UPDATE(外键检查) | 原始写入命令在写入目标表上取得 ROW EXCLUSIVE;外键检查的 ROW SHARE 与 FOR KEY SHARE 则作用于被引用的表和行,不能混为同一对象。 | |
| COPY … FROM(外键检查) | 原始写入命令在写入目标表上取得 ROW EXCLUSIVE;外键检查的 ROW SHARE 与 FOR KEY SHARE 则作用于被引用的表和行,不能混为同一对象。 | |
| MERGE(外键检查) | 原始写入命令在写入目标表上取得 ROW EXCLUSIVE;外键检查的 ROW SHARE 与 FOR KEY SHARE 则作用于被引用的表和行,不能混为同一对象。 | |
| VACUUM(不含 FULL) | 常规清理持有此锁;尝试截断表尾空页时还可能短暂取得 ACCESS EXCLUSIVE。 | |
| ANALYZE | 在被分析的目标表上取得此模式。 | |
| CREATE INDEX CONCURRENTLY | 作用于被索引的表;多个事务阶段构建并等待旧事务,不表示无等待。 | |
| CREATE STATISTICS | 在被收集统计信息的表上加锁。 | |
| COMMENT ON(关系对象) | COMMENT 在所注释对象上取得此模式;不同对象上的同名锁不会互相冲突。 | |
| DROP INDEX CONCURRENTLY | 在所属表上取得此模式,分阶段等待并移除索引;不在表上持有普通 DROP INDEX 的 ACCESS EXCLUSIVE。 | |
| REINDEX … CONCURRENTLY | PostgreSQL 12 起;会话级 SHARE UPDATE EXCLUSIVE 锁覆盖被重建的索引及所属表,分多个事务完成构建、验证、切换与清理。 | |
| LOCK TABLE … IN SHARE UPDATE EXCLUSIVE MODE | 显式请求此表级模式;省略 IN … MODE 时默认为 ACCESS EXCLUSIVE。 | |
| ALTER TABLE … ALTER COLUMN … SET STATISTICS | 修改列统计目标。 | |
| ALTER TABLE … ALTER COLUMN … SET (n_distinct = …) | 修改列统计选项;RESET 同样适用。 | |
| ALTER TABLE … CLUSTER ON | 设置后续聚簇使用的索引;此命令本身不重写表。 | |
| ALTER TABLE … SET WITHOUT CLUSTER | 清除聚簇索引标记。 | |
| ALTER TABLE … VALIDATE CONSTRAINT | 在当前表上验证约束;外键验证还需要访问被引用表。 | |
| ALTER TABLE … ATTACH PARTITION(父表) | 父表锁级别逐版本解析;待挂载分区另取 ACCESS EXCLUSIVE。PostgreSQL 11 起如有默认分区,也需锁定默认分区。 | |
| ALTER TABLE … DETACH PARTITION … FINALIZE(父表) | 完成中断的并发分离;被分离分区另取 ACCESS EXCLUSIVE。 | |
| ALTER TABLE … SET / RESET (fillfactor = …) | 表存储参数按参数定义选择锁;fillfactor 可用 SHARE UPDATE EXCLUSIVE。 | |
| ALTER TABLE … SET / RESET (autovacuum_* = …) | 表的自动清理存储参数使用 SHARE UPDATE EXCLUSIVE。 | |
| ALTER TABLE … SET / RESET (toast.autovacuum_* = …) | 这里给出 TOAST 自动清理参数;不存在笼统的 SET TOAST 子命令,其他参数按具体定义选择锁。 | |
| ALTER TABLE … DETACH PARTITION … CONCURRENTLY(父表) | PostgreSQL 14 起,分两个事务进行;父表使用 SHARE UPDATE EXCLUSIVE,等待使用分区的事务结束后进入完成阶段。 | |
| ALTER TABLE … DETACH PARTITION … CONCURRENTLY(分区,第一阶段) | 第一阶段父表与分区使用 SHARE UPDATE EXCLUSIVE;提交并等待后再升级分区锁。 | |
| ALTER INDEX … RENAME | 作用于被重命名的索引本身。 | |
| ALTER TABLE … INHERIT(父表) | 在新指定的继承父表上取得 SHARE UPDATE EXCLUSIVE;被修改的子表另取 ACCESS EXCLUSIVE。 | |
| CREATE INDEX(不含 CONCURRENTLY) | 作用于被索引的表,阻止表上并发写入。 | |
| REINDEX(所属表) | 非并发重建在所属表上取得 SHARE;被重建的索引另取 ACCESS EXCLUSIVE,不能把索引锁误写成整个表的 ACCESS EXCLUSIVE。 | |
| LOCK TABLE … IN SHARE MODE | 显式请求此表级模式;省略 IN … MODE 时默认为 ACCESS EXCLUSIVE。 | |
| CREATE TRIGGER | 在触发器所属表上加锁。 | |
| LOCK TABLE … IN SHARE ROW EXCLUSIVE MODE | 显式请求此表级模式;省略 IN … MODE 时默认为 ACCESS EXCLUSIVE。 | |
| ALTER TABLE … ENABLE / DISABLE TRIGGER | 启停触发器,包括 USER / ALL / REPLICA / ALWAYS 相应形式。 | |
| ALTER TABLE … ADD FOREIGN KEY [NOT VALID](引用表) | 引用方与被引用方都取得 SHARE ROW EXCLUSIVE;NOT VALID 只省略已有数据的初始验证,不免除这个锁。 | |
| ALTER TABLE … ADD FOREIGN KEY [NOT VALID](被引用表) | 与引用方同样取得 SHARE ROW EXCLUSIVE,不能把被引用表记为只有 ACCESS SHARE。 | |
| REFRESH MATERIALIZED VIEW CONCURRENTLY | 作用于被刷新的物化视图;普通读取可继续,同一个物化视图同时只允许一个刷新。 | |
| LOCK TABLE … IN EXCLUSIVE MODE | 显式请求此表级模式;省略 IN … MODE 时默认为 ACCESS EXCLUSIVE。 | |
| REFRESH MATERIALIZED VIEW(不含 CONCURRENTLY) | 作用于被刷新的物化视图,同时阻止普通读取。 | |
| DROP TABLE | 作用于被删除的表;依赖对象及 CASCADE 还可能取得额外锁。 | |
| DROP INDEX(不含 CONCURRENTLY) | 在所属表上加 ACCESS EXCLUSIVE,阻塞读写;被删除的索引也需要锁定。 | |
| TRUNCATE | 在被截断的各表上加锁;包含的表和依赖对象依命令选项而定。 | |
| CLUSTER | 重写目标表期间阻止并发读写。 | |
| VACUUM FULL | 重写目标表期间阻止并发读写。 | |
| VACUUM(截断表尾阶段) | 常规 VACUUM 尝试将末尾空页归还操作系统时,短暂尝试 ACCESS EXCLUSIVE;可用相应版本支持的截断选项避免该阶段。 | |
| REINDEX(被重建索引) | 此锁作用于索引本身,而非所属表;查询规划也会访问索引,所以非并发 REINDEX 仍可能阻塞查询。 | |
| LOCK TABLE … IN ACCESS EXCLUSIVE MODE | 显式请求此表级模式;省略 IN … MODE 时默认为 ACCESS EXCLUSIVE。 | |
| ALTER TABLE … ADD COLUMN | 是否需要重写取决于版本与默认表达式;避免重写并不降低这里的锁级别。 | |
| ALTER TABLE … DROP COLUMN | 删除列并改变表结构。 | |
| ALTER TABLE … ALTER COLUMN … SET / DROP DEFAULT | 修改列默认值。 | |
| ALTER TABLE … ALTER COLUMN … TYPE | 改变列类型;是否重写不改变这里列出的锁要求。 | |
| ALTER TABLE … ALTER COLUMN … SET STORAGE | 修改列存储策略。 | |
| ALTER TABLE … ALTER COLUMN … SET COMPRESSION | 修改列压缩方法。 | |
| ALTER TABLE … SET TABLESPACE | 移动表的表空间。 | |
| ALTER TABLE … SET LOGGED / UNLOGGED | 切换日志持久性。 | |
| ALTER TABLE … SET ACCESS METHOD | 修改表访问方法。 | |
| ALTER TABLE … DROP CONSTRAINT | 删除约束及可能依赖的索引。 | |
| ALTER TABLE … ALTER CONSTRAINT | 修改约束属性。 | |
| ALTER TABLE … ALTER COLUMN … SET NOT NULL | 设置非空约束。 | |
| ALTER TABLE … ALTER COLUMN … DROP NOT NULL | 移除非空约束。 | |
| ALTER TABLE … ENABLE / DISABLE RULE | 启停规则。 | |
| ALTER TABLE … ENABLE / DISABLE ROW LEVEL SECURITY | 启停行级安全策略。 | |
| ALTER TABLE … FORCE / NO FORCE ROW LEVEL SECURITY | 改变表所有者是否受行级安全策略约束。 | |
| ALTER TABLE … ALTER COLUMN … DROP EXPRESSION | 移除生成列表达式。 | |
| ALTER TABLE … ALTER COLUMN … SET EXPRESSION | 设置生成列表达式。 | |
| ALTER TABLE … ALTER COLUMN … SET GENERATED / RESTART / SET sequence_option | 修改标识列属性或其隐式序列选项;不是名为 SET SEQUENCE 的独立子命令。 | |
| ALTER TABLE … ALTER COLUMN … ADD GENERATED … AS IDENTITY | 为列增加标识属性。 | |
| ALTER TABLE … ALTER COLUMN … DROP IDENTITY | 移除标识属性。 | |
| ALTER TABLE … INHERIT / NO INHERIT(子表) | 此处列出被修改的子表;父表另按继承处理锁定。 | |
| ALTER TABLE … OWNER TO | 修改表所有者。 | |
| ALTER TABLE … REPLICA IDENTITY | 修改复制标识。 | |
| ALTER TABLE … RENAME | 重命名表、列或约束。 | |
| ALTER TABLE … ADD CONSTRAINT(CHECK / UNIQUE / PRIMARY KEY / EXCLUDE) | 普通添加约束;ADD FOREIGN KEY 使用较弱的 SHARE ROW EXCLUSIVE。 | |
| ALTER TABLE … ATTACH PARTITION(待挂载分区) | 待挂载表需 ACCESS EXCLUSIVE;合适的 CHECK 约束可以免除验证扫描,但不免除对这张表的锁。 | |
| ALTER TABLE … ATTACH PARTITION(默认分区) | PostgreSQL 11 起如有默认分区,对其取得 ACCESS EXCLUSIVE;合适 CHECK 约束可免扫描,不能免除默认分区本身的锁。递归子分区另按验证需要处理。 | |
| ALTER TABLE … DETACH PARTITION(父表) | 未使用 CONCURRENTLY 的常规分离。 | |
| ALTER TABLE … DETACH PARTITION(被分离分区) | 常规分离在被分离分区上取得 ACCESS EXCLUSIVE。 | |
| ALTER TABLE … DETACH PARTITION … CONCURRENTLY(分区,完成阶段) | 第二阶段在被分离分区取得 ACCESS EXCLUSIVE;不允许存在默认分区时使用 CONCURRENTLY。 | |
| ALTER INDEX … SET TABLESPACE | 作用于被移动的索引;不要把索引上的锁当作同名表上的锁。 | |
| ALTER INDEX … SET / RESET (fillfactor = …) | 作用于被修改的索引本身。 | |
| ALTER INDEX … ATTACH PARTITION | PostgreSQL 11 起;修改父分区索引与被附加的子索引。 | |
| SELECT FOR KEY SHARE | 作用于实际选中的行;目标表同时取得 ROW SHARE。NOWAIT / SKIP LOCKED 改变等待行为,不改变锁冲突规则。 | |
| INSERT(外键检查) | 实际检查非空外键引用时,在被引用表的匹配行上取得 FOR KEY SHARE;可能在语句内或延迟约束检查时执行。级联动作还会取得相应 UPDATE / DELETE 的锁。 | |
| UPDATE(外键检查) | 实际检查非空外键引用时,在被引用表的匹配行上取得 FOR KEY SHARE;可能在语句内或延迟约束检查时执行。级联动作还会取得相应 UPDATE / DELETE 的锁。 | |
| COPY … FROM(外键检查) | 实际检查非空外键引用时,在被引用表的匹配行上取得 FOR KEY SHARE;可能在语句内或延迟约束检查时执行。级联动作还会取得相应 UPDATE / DELETE 的锁。 | |
| MERGE(外键检查) | 实际检查非空外键引用时,在被引用表的匹配行上取得 FOR KEY SHARE;可能在语句内或延迟约束检查时执行。级联动作还会取得相应 UPDATE / DELETE 的锁。 | |
| SELECT FOR SHARE | 作用于实际选中的行;目标表同时取得 ROW SHARE。NOWAIT / SKIP LOCKED 改变等待行为,不改变锁冲突规则。 | |
| 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 排除更新也会锁行。 | |
| SELECT FOR UPDATE | 作用于实际选中的行;目标表同时取得 ROW SHARE。NOWAIT / SKIP LOCKED 改变等待行为,不改变锁冲突规则。 | |
| UPDATE(修改键值) | 修改可供外键引用的唯一索引列时使用;部分索引和表达式索引不算在内。 | |
| DELETE | 在被删除的已有行上取得此模式;目标表同时取得 ROW EXCLUSIVE。 | |
| MERGE … WHEN MATCHED THEN DELETE / UPDATE(键) | 实际删除或更新键列的匹配行;纯插入分支不适用。 | |
| INSERT … ON CONFLICT DO UPDATE(键) | 冲突路径修改键列时,锁住冲突的已有行;不是普通 INSERT 的固定行锁。 |
没有匹配的命令。试试更短的关键词。
这 12 种是锁模式,由 8 种表级模式和 4 种行级模式组成;它们不是 pg_locks.locktype 的全部锁对象类别。锁模式、锁对象和等待事件分别回答「怎样锁」「锁什么」和「正在等什么」。
下面的只读查询列出当前有阻塞者的会话。pg_blocking_pids() 同时考虑已持有冲突锁的会话和排在前面的冲突请求;进一步检查对象与模式时,结合 pg_locks。
SELECT pid, usename, wait_event_type, wait_event,
pg_blocking_pids(pid) AS blocking_pids,
query
FROM pg_stat_activity
WHERE cardinality(pg_blocking_pids(pid)) > 0
ORDER BY pid;
会话和查询文本的可见范围取决于当前用户权限。行锁通常不会直接逐行列在 pg_locks 中,行锁等待常表现为等待持锁事务结束。
当前查看 PostgreSQL 18,采样构建 REL_18_STABLE · 753057e340da。冲突关系与命令行为按该版本的文档和源码整理。命令链接进入本站 SQL 命令百科,并保留所选版本。
资料核验日期:2026-09-26。