锁和表

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 会更改所选定的行以标记它们,因而会导致磁盘写动作。

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

�