↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

已结束支持的版本: 6.5 / 6.4
历史版本。 PostgreSQL 6.5 已结束支持。 请参阅 当前版本手册.

10.5. 锁与表

Postgres 提供多种锁模式来控制对表中数据的并发访问。其中一些锁模式由 Postgres 在语句执行之前自动获取,另一些则供应用使用。事务中获取的所有锁模式(AccessShareLock 除外)在该事务期间一直保持。

除了锁之外,还使用短期的共享/排他闩锁来控制对共享缓冲池中表页的读写访问。闩锁在取到或更新一个元组后立即释放。

10.5.1. 表级锁

AccessShareLock

在被查询的表上自动获取的一种内部锁模式。Postgres 会在语句完成之后释放这些锁。

只与 AccessExclusiveLock 冲突。

RowShareLock

由 SELECT FOR UPDATE 以及 IN ROW SHARE MODE 的 LOCK TABLE 语句获取。

与 ExclusiveLock 和 AccessExclusiveLock 模式冲突。

RowExclusiveLock

由 UPDATE、DELETE、INSERT 以及 IN ROW EXCLUSIVE MODE 的 LOCK TABLE 语句获取。

与 ShareLock、ShareRowExclusiveLock、ExclusiveLock 和 AccessExclusiveLock 模式冲突。

ShareLock

由 CREATE INDEX 以及 IN SHARE MODE 的 LOCK TABLE 语句获取。

与 RowExclusiveLock、ShareRowExclusiveLock、ExclusiveLock 和 AccessExclusiveLock 模式冲突。

ShareRowExclusiveLock

由 IN SHARE ROW EXCLUSIVE MODE 的 LOCK TABLE 语句获取。

与 RowExclusiveLock、ShareLock、ShareRowExclusiveLock、ExclusiveLock 和 AccessExclusiveLock 模式冲突。

ExclusiveLock

由 IN EXCLUSIVE MODE 的 LOCK TABLE 语句获取。

与 RowShareLock、RowExclusiveLock、ShareLock、ShareRowExclusiveLock、ExclusiveLock 和 AccessExclusiveLock 模式冲突。

AccessExclusiveLock

由 ALTER TABLE、DROP TABLE、VACUUM 和 LOCK TABLE 语句获取。

与 RowShareLock、RowExclusiveLock、ShareLock、ShareRowExclusiveLock、ExclusiveLock 和 AccessExclusiveLock 模式冲突。

注意

只有 AccessExclusiveLock 会阻塞(不带 FOR UPDATE 的)SELECT 语句。

10.5.2. 行级锁

这些锁在行的内部字段被更新(或删除或标记为更新)时获取。Postgres 不会在内存中保存任何关于已修改行的信息,因此在无锁升级的情况下锁定的行数也没有限制。

不过,要注意 SELECT FOR UPDATE 会修改被选中的行以标记它们,因此会产生磁盘写入。

行级锁不影响数据查询。它们只用来阻塞同一行的写者。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.