PostgreSQL
提供多种锁模式来控制对表中数据的并行访问。
有些锁模式是在语句执行之前由
PostgreSQL
自动施加的,而其他的提供给应用使用。
一个事务里要求的所有锁模式(除了 AccessShareLock)
都是在整个事务期间保有的。
-
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
语句)。
当更新行的时候(或者删除的时候,或标记为用于更新的时候)需要行级锁.
行级锁不影响数据查询.它们只阻塞对
同一行
的写.
PostgreSQL
不会在内存里保存任何关于已修改行的信息,因此对一次锁定的行数没有
限制.不过,锁住一行会导致一次磁盘写;因此,象
SELECT FOR UPDATE
将修改选中的行以标记它们,
因此会导致磁盘写.
除了锁以外,短期的共享/排他销也在共享的缓冲池中用于控制
对表页面的读/写访问。销在一条记录抓取或者更新后马上被释放。
应用程序员通常不需要关系页级锁,我们在这里提到它们只是为了
完整.
|