锁和表
Postgres 提供多种锁模式来控制对表中数据的并行访问。有些锁模式是在语句执行之前由
Postgres
自动施加的,而其他的提供用来由应用使用的。一个事务里要求的所有锁模式(除了
AccessShareLock)都是在整个事务期间保有的。
除了锁以外,短期的共享/排他销也在共享的缓冲池中用于控制对表页面的读/写访问。销在一条记录抓取或者更新后马上被释放。
表级锁
-
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 阻塞 SELECT
(没有 FOR UPDATE)语句。
行级锁
当某行的一个内部字段被更新(或删除或标记为更新)时要求使用这些锁。
Postgres
在内存里不做关于已更新的行的任何记忆,因而对锁定的行数没有任何限制,也没有锁定递增。
但是,要注意 SELECT FOR UPDATE 会更改所选定的行以标记它们,因而会导致磁盘写动作。
行级别的锁不影响数据查询。它们只是用于阻塞对同一行的写。
�