PG锁
一、表级锁定模式
(1)ACCESS SHARE
(AccessShareLock
)-
ACCESS EXCLUSIVE
仅与锁定模式冲突。该
SELECT
命令在引用的表上获取此模式的锁。一般来说,任何只读取表而不修改它的查询都会获取这种锁定模式。 (2)ROW SHARE
(RowShareLock
)-
EXCLUSIVE
与和ACCESS EXCLUSIVE
锁定模式冲突。SELECT FOR UPDATE 和
命令在目标表上获取此模式的SELECT FOR SHARE
锁(除了ACCESS SHARE
在任何其他被引用但未选择的表上的锁FOR UPDATE/FOR SHARE
)。 (4)ROW EXCLUSIVE
(RowExclusiveLock
)-
SHARE
与,SHARE ROW EXCLUSIVE
,EXCLUSIVE
, 和ACCESS EXCLUSIVE
lock 模式冲突。命令
UPDATE
、DELETE
和INSERT
在目标表上获取此锁定模式(除了ACCESS SHARE
任何其他引用表上的锁定)。一般来说,任何修改表中数据的命令都会获取这种锁定模式。 (5)SHARE UPDATE EXCLUSIVE
(ShareUpdateExclusiveLock
)-
SHARE UPDATE EXCLUSIVE
与,SHARE
,SHARE ROW EXCLUSIVE
,EXCLUSIVE
, 和ACCESS EXCLUSIVE
lock 模式冲突。此模式保护表免受并发模式更改和VACUUM
运行。由
VACUUM
(不带FULL
)、ANALYZE
、CREATE INDEX CONCURRENTLY
、CREATE STATISTICS
、COMMENT ON
、REINDEX CONCURRENTLY
以及某些ALTER INDEX
和ALTER TABLE
变体获得(有关完整详细信息,请参阅这些命令的文档)。 (6)SHARE
(ShareLock
)-
ROW EXCLUSIVE
与,SHARE UPDATE EXCLUSIVE
,SHARE ROW EXCLUSIVE
,EXCLUSIVE
, 和ACCESS EXCLUSIVE
lock 模式冲突。此模式保护表免受并发数据更改的影响。由
CREATE INDEX
(无CONCURRENTLY
)获得。 (7)SHARE ROW EXCLUSIVE
(ShareRowExclusiveLock
)-
ROW EXCLUSIVE
与,SHARE UPDATE EXCLUSIVE
,SHARE
,SHARE ROW EXCLUSIVE
,EXCLUSIVE
, 和ACCESS EXCLUSIVE
lock 模式冲突。此模式可保护表免受并发数据更改的影响,并且是自排的,因此一次只能有一个会话持有它。被
CREATE TRIGGER
某些形式的ALTER TABLE
. (8)EXCLUSIVE
(ExclusiveLock
)-
ROW SHARE
与,ROW EXCLUSIVE
,SHARE UPDATE EXCLUSIVE
,SHARE
,SHARE ROW EXCLUSIVE
,EXCLUSIVE
, 和ACCESS EXCLUSIVE
lock 模式冲突。这种模式只允许并发ACCESS SHARE
锁,即只有从表中读取可以与持有这种锁模式的事务并行进行。被收购
REFRESH MATERIALIZED VIEW CONCURRENTLY
。 (9)ACCESS EXCLUSIVE
(AccessExclusiveLock
)-
与所有模式的锁冲突(
ACCESS SHARE
,ROW SHARE
,ROW EXCLUSIVE
,SHARE UPDATE EXCLUSIVE
,SHARE
,SHARE ROW EXCLUSIVE
,EXCLUSIVE
, 和ACCESS EXCLUSIVE
)。这种模式保证持有者是唯一以任何方式访问表的事务。由
DROP TABLE
,TRUNCATE
,REINDEX
,CLUSTER
,VACUUM FULL
, 和REFRESH MATERIALIZED VIEW
(不带CONCURRENTLY
)命令获取。许多形式的ALTER INDEX
并且ALTER TABLE
也在这个级别获得了一个锁。这也是LOCK TABLE
未明确指定模式的语句的默认锁定模式。

二、行级
除了表级锁,还有行级锁,下面列出了PostgreSQL自动使用它们的上下文。有关行级锁冲突的完整表,请官网13.3 。请注意,一个事务可以在同一行上持有冲突的锁,即使在不同的子事务中也是如此;但除此之外,两个事务永远不能在同一行上持有冲突的锁。行级锁不影响数据查询;他们只阻止作家和储物柜到同一行。行级锁在事务结束或保存点回滚期间释放,就像表级锁一样。
(1)FOR UPDATE
-
FOR UPDATE
导致SELECT
语句检索到的行被锁定,就像更新一样。这可以防止它们被其他事务锁定、修改或删除,直到当前事务结束。也就是说,其他尝试UPDATE
,DELETE
,SELECT FOR UPDATE
,或这些行的事务将被阻塞SELECT FOR NO KEY UPDATE
,直到当前事务结束;相反,将等待已在同一行上运行任何这些命令的并发事务,然后将锁定并返回更新的行(或没有行,如果该行已被删除)。但是,在or事务中,如果要锁定的行在事务开始后发生了更改,则会引发错误。有关进一步的讨论,请参见官网第 13.4 节。SELECT FOR SHARE
SELECT FOR KEY SHARE
SELECT FOR UPDATE
REPEATABLE READ
SERIALIZABLE
FOR UPDATE
锁定模式也由任何一行获得,DELETE
也由UPDATE
修改某些列的值的 an 获得。目前,该UPDATE
案例考虑的列集是那些具有唯一索引的列,可以在外键中使用(因此不考虑部分索引和表达式索引),但这可能会在未来发生变化。 (2)FOR NO KEY UPDATE
-
行为类似于
FOR UPDATE
,除了获取的锁较弱:此锁不会阻止SELECT FOR KEY SHARE
尝试在相同行上获取锁的命令。这种锁定模式也被任何UPDATE
没有获得FOR UPDATE
锁的人获得。 (3)FOR SHARE
-
行为类似于
FOR NO KEY UPDATE
,除了它在每个检索到的行上获取共享锁而不是排他锁。共享锁会阻止其他事务在这些行上执行UPDATE
、或DELETE
,但不会阻止它们执行或。SELECT FOR UPDATE
SELECT FOR NO KEY UPDATE
SELECT FOR SHARE
SELECT FOR KEY SHARE
(4)FOR KEY SHARE
-
行为类似于
FOR SHARE
,除了锁更弱:SELECT FOR UPDATE
被阻塞,但不是SELECT FOR NO KEY UPDATE
。密钥共享锁阻止其他事务执行DELETE
或任何UPDATE
更改键值的事务,但不阻止其他事务UPDATE
,也不会阻止SELECT FOR NO KEY UPDATE
、SELECT FOR SHARE
或SELECT FOR KEY SHARE
。
PostgreSQL不记得内存中修改行的任何信息,因此一次锁定的行数没有限制。但是,锁定行可能会导致磁盘写入,例如,SELECT FOR UPDATE
修改选定的行以将它们标记为锁定,因此会导致磁盘写入。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏