Postgres 提供多种锁模式来控制对表中数据的并行访问。 有些锁模式是在语句执行之前由 Postgres 自动施加的,而其他的提供给应用使用。 一个事务里要求的所有锁模式(除了 AccessShareLock) 都是在整个事务期间保有的。
一个内部锁模式,进行查询时自动施加在被查询的表上。
只与 AccessExclusiveLock 冲突。
被 SELECT FOR UPDATE 和用于 IN ROW SHARE MODE 的 LOCK TABLE 语句要求。
与 ExclusiveLock 和 AccessExclusiveLock 模式冲突。
被 UPDATE,DELETE, INSERT 和 用于 IN ROW EXCLUSIVE MODE 的 LOCK TABLE 语句要求。
与 ShareLock,ShareRowExclusiveLock,ExclusiveLock 和 AccessExclusiveLock 模式冲突。
被 CREATE INDEX 和用于 IN SHARE MODE 的 LOCK TABLE table 语句所要求。
与 RowExclusiveLock,ShareRowExclusiveLock, ExclusiveLock 和 AccessExclusiveLock 模式冲突。
被用于 IN SHARE ROW EXCLUSIVE MODE 的 LOCK TABLE 语句要求。
与 RowExclusiveLock,ShareLock, ShareRowExclusiveLock,ExclusiveLock 和 AccessExclusiveLock 模式冲突。
被用于 IN EXCLUSIVE MODE 的 LOCK TABLE 语句要求。
与 RowShareLock,RowExclusiveLock,ShareLock, ShareRowExclusiveLock,ExclusiveLock 和 AccessExclusiveLock 模式冲突。
被 ALTER TABLE, DROP TABLE, VACUUM 和 LOCK TABLE 语句要求。
与 RowShareLock,RowExclusiveLock,ShareLock, ShareRowExclusiveLock,ExclusiveLock 和 AccessExclusiveLock 模式冲突。 一句话,与所有模式冲突.
注意: 只有 AccessExclusiveLock 阻塞 SELECT (没有 FOR UPDATE语句)。
当更新行的时候(或者删除的时候,或标记为用于更新的时候)需要这些锁. 行级锁不影响数据查询.它们只阻塞对同一行的写.
Postgres 不会在内存里保存任何关于已修改行的信息,因此对一次锁定的行数没有 限制.不过,锁住一行会导致一次磁盘写;因此,象 SELECT FOR UPDATE 将修改选中的行以标记它们, 因此会导致磁盘写.
除了锁以外,短期的共享/排他销也在共享的缓冲池中用于控制 对表页面的读/写访问。销在一条记录抓取或者更新后马上被释放。 应用程序员通常不需要关系页级锁,我们在这里提到它们只是为了 完整.