PostgreSQL
上一页 第十章. 多版本并行控制 下一页

锁和表

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

除了锁以外,短期的共享/排他销也在共享的缓冲池中用于控制对表页面的读/写访问。销在一条记录抓取或者更新后马上被释放。

表级锁

AccessShareLock
一个内部锁模式,进行查询时自动施加在被查询的表上。语句执行完成后,Postgres 释放这些锁。

只与 AccessExclusiveLock 冲突。

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

与 ExclusiveLock 和 AccessExclusiveLock 模式冲突。

RowExclusiveLock
UPDATE, DELETE, INSERT 和用于IN ROW EXCLUSIVE MODELOCK TABLE 语句要求。

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

ShareLock
CREATE INDEX 和用于IN SHARE MODELOCK 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 TABLE, DROP TABLE, VACUUMLOCK TABLE 语句要求。

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

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

行级锁

当某行的一个内部字段被更新(或删除或标记为更新)时要求使用这些锁。Postgres 在内存里不做关于已更新的行的任何记忆,因而对锁定的行数没有任何限制,也没有锁定递增。

但是,要注意 SELECT FOR UPDATE 会更改所选定的行以标记它们,因而会导致磁盘写动作。

行级别的所不影响数据查询。它们只是用于阻塞对同一行 的写。


上一页 首页 下一页
可串行化隔离级别 开头 锁和索引