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

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

文档 / 锁百科

PostgreSQL 锁百科

一条 SQL 会取得哪些锁,又会与谁互相阻塞?这里汇集 8 种表级锁模式与 4 种行级锁模式,按版本查看冲突关系,并关联取得这些锁的 SQL 命令。锁模式与 等待事件 是理解同一次等待的不同视角。

当前稳定版

表级锁冲突矩阵 8 × 8

纵轴是请求的锁,横轴是另一事务已经持有的锁。只比较同一个表上的锁模式;名称中的 ROW 并不表示它是行级锁。

  • ×冲突
  • ·兼容
表级锁冲突矩阵。纵轴为请求的锁,横轴为另一事务已持有的锁。× 表示表锁冲突,· 表示兼容。
已持有 →请求 ↓ ASRSRXSUESSRXXAX
ACCESS SHARE
ROW SHARE
ROW EXCLUSIVE
SHARE UPDATE EXCLUSIVE
SHARE
SHARE ROW EXCLUSIVE
EXCLUSIVE
ACCESS EXCLUSIVE

选择方格,查看请求的锁与已持有的锁能否共存。键盘方向键可在矩阵中移动。

按表锁展开的组合矩阵 14 × 14

按操作同时取得的表锁,对行锁组合分组:ROW SHARE 下展开四种 SELECT … FOR 组合,ROW EXCLUSIVE 下展开修改行的两种组合。共 14 个比较项,包含 8 个「仅表锁」项和 6 个「表锁 + 行锁」组合,仍然只有 12 种锁模式。

  • ×表锁冲突,不同行也冲突
  • ●同一行时冲突
  • ·锁模式兼容
按表锁展开的组合冲突矩阵。纵轴为请求的锁,横轴为另一事务已持有的锁。× 表示表锁冲突,· 表示兼容,● 表示只有作用于同一行时才发生行锁冲突。组合按操作同时取得的表锁分组,子项表示同时取得表锁与行锁。
已持有 →请求 ↓ ASROW SHAREROW EXCLUSIVESUESSRXXAX
仅表锁仅表锁FKSFSFNKUFU仅表锁FNKUFU仅表锁仅表锁仅表锁仅表锁仅表锁
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

12 种锁模式

表级锁保护整个关系;行级锁协调对同一行的修改和锁定。下表中的命令是常见取得方式,具体条件见「命令与锁」。

表级锁

ROW EXCLUSIVE

行排他锁

详情
表级锁

SHARE UPDATE EXCLUSIVE

共享更新排他锁

详情
表级锁

ACCESS EXCLUSIVE

访问排他锁

与全部表级锁模式冲突;也是唯一会阻塞普通 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

详情

命令与锁

同一命令可能因选项、对象或执行阶段取得不同模式。表中保留这些条件;点击命令可查看 PostgreSQL 18 的完整语法。

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 的全部锁对象类别。锁模式、锁对象和等待事件分别回答「怎样锁」「锁什么」和「正在等什么」。

  • 普通 SELECT 通过 MVCC 读取,不取得这里的行级锁,但仍需取得表级 ACCESS SHARE 锁。
  • SELECT … FOR UPDATE / SHARE 等行锁子句还会取得表级 ROW SHARE 锁;UPDATE / DELETE 还会取得表级 ROW EXCLUSIVE 锁。因此,行操作也可能被表锁挡住。
  • 组合矩阵按操作同时取得的表锁,将常见行锁组合分组,再按「表锁冲突,或同一行上的行锁冲突」判断。红色 × 来自表锁,即使操作不同行也会冲突;琥珀色 ● 只在两边锁定同一行时冲突。它列出常见的 14 个比较项,并不表示还有两种额外锁模式。
  • 矩阵比较不同事务,同一事务不会因自身持有的模式而按此矩阵阻塞。锁通常持有到事务结束;回滚到保存点会释放该保存点之后取得的锁。行锁、事务和保存点的细节见显式锁定。
  • 矩阵只描述锁模式能否共存。等待队列中的先来请求也可能让后来的请求排队;实际行为还受对象、命令阶段、事务状态及 NOWAIT / SKIP LOCKED 等选项影响。

咨询锁

应用自行约定键值,可以选择共享或独占、会话级或事务级。参见咨询锁。

谓词锁

SIReadLock 用于可串行化快照隔离的依赖检测,不按这里的矩阵阻塞写入。参见可串行化隔离级别。

内部同步

页级锁、轻量锁等还参与数据库内部同步。它们不属于这 12 种 SQL 锁模式;排查时结合统计与等待事件。

查看谁在阻塞谁

下面的只读查询列出当前有阻塞者的会话。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。