9.6. 锁和表

Postgres 提供多种锁模式来控制对表中数据的并行访问。 有些锁模式是在语句执行之前由 Postgres 自动施加的,而其他的提供给应用使用。 一个事务里要求的所有锁模式(除了 AccessShareLock) 都是在整个事务期间保有的。

9.6.1. 表级锁

AccessShareLock

一个内部锁模式,进行查询时自动施加在被查询的表上。

只与 AccessExclusiveLock 冲突。

RowShareLock

SELECT FOR UPDATE 和用于 IN ROW SHARE MODELOCK TABLE 语句要求。

与 ExclusiveLock 和 AccessExclusiveLock 模式冲突。

RowExclusiveLock

UPDATEDELETEINSERT 和 用于 IN ROW EXCLUSIVE MODELOCK TABLE 语句要求。

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

ShareLock

CREATE INDEX 和用于 IN SHARE MODELOCK TABLE table 语句所要求。

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

ShareRowExclusiveLock

被用于 IN SHARE ROW EXCLUSIVE MODELOCK TABLE 语句要求。

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

ExclusiveLock

被用于 IN EXCLUSIVE MODELOCK TABLE 语句要求。

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

AccessExclusiveLock

ALTER TABLEDROP TABLEVACUUMLOCK TABLE 语句要求。

与 RowShareLock,RowExclusiveLock,ShareLock, ShareRowExclusiveLock,ExclusiveLock 和 AccessExclusiveLock 模式冲突。 一句话,与所有模式冲突.

注意: 只有 AccessExclusiveLock 阻塞 SELECT (没有 FOR UPDATE语句)。

9.6.2. 行级锁

当更新行的时候(或者删除的时候,或标记为用于更新的时候)需要这些锁. 行级锁不影响数据查询.它们只阻塞对同一行的写.

Postgres 不会在内存里保存任何关于已修改行的信息,因此对一次锁定的行数没有 限制.不过,锁住一行会导致一次磁盘写;因此,象 SELECT FOR UPDATE 将修改选中的行以标记它们, 因此会导致磁盘写.

除了锁以外,短期的共享/排他销也在共享的缓冲池中用于控制 对表页面的读/写访问。销在一条记录抓取或者更新后马上被释放。 应用程序员通常不需要关系页级锁,我们在这里提到它们只是为了 完整.