您的位置:寻梦网首页编程乐园数据库PostgreSQL 7.2 Documentation

9.6. 锁和表

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

9.6.1. 表级锁

AccessShareLock

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

只与 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 模式冲突。

ShareUpdateExclusiveLock

VACUUM (不带 FULL 选项) 以及用于 IN SHARE UPDATE EXCLUSIVE MODE LOCK TABLE 语句要求这样的锁.

和 ShareUpdateExclusiveLock,ShareLock,ShareRowExclusiveLock, ExclusiveLock 和 AccessExclusiveLock 模式冲突.

ShareLock

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

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

ShareRowExclusiveLock

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

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

ExclusiveLock

被用于 IN EXCLUSIVE MODE LOCK TABLE 语句要求。

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

AccessExclusiveLock

ALTER TABLE DROP TABLE VACUUM FULL LOCK TABLE 语句要求。

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

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

9.6.2. 行级锁

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

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

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