表级锁模式
ACCESS SHARE
只与 ACCESS EXCLUSIVE 冲突。
SELECT 和 ANALYZE 命令在被引用的表上请求一个这种锁。 通常,任何只读取表而不修改它的命令都请求这种锁模式。
ROW SHARE
与EXCLUSIVE和ACCESS EXCLUSIVE模式冲突。
SELECT FOR UPDATE 和 SELECT FOR SHARE 命令在目标表上需要一个这样模式的锁(加上在所有被引用但没有 FOR UPDATE/FOR SHARE 的表上的 ACCESS SHARE 锁)。
ROW EXCLUSIVE
与 SHARE,SHARE ROW EXCLUSIVE, EXCLUSIVE 和 ACCESS EXCLUSIVE 模式冲突。
命令 UPDATE,DELETE, 和 INSERT 自动请求这个锁模式。 (加上所有其它被引用的表上的 ACCESS SHARE 锁)。 通常,这种锁将被任何修改表中数据的查询请求。
SHARE UPDATE EXCLUSIVE
和 SHARE UPDATE EXCLUSIVE,SHARE, SHARE ROW EXCLUSIVE,EXCLUSIVE, 和 ACCESS EXCLUSIVE 模式冲突。 这个模式保护一个表不被并发模式改变和 VACUUM。
VACUUM(不带 FULL 选项)请求这样的锁。
SHARE
与 ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE, SHARE ROW EXCLUSIVE,EXCLUSIVE 和 ACCESS EXCLUSIVE 模式冲突。 这个模式避免表的并发数据修改。
CREATE INDEX 语句要求这样的锁模式。
SHARE ROW EXCLUSIVE
与 ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE,SHARE, SHARE ROW EXCLUSIVE,EXCLUSIVE, 和 ACCESS EXCLUSIVE 模式冲突。
任何 PostgreSQL 命令都不会自动请求这样的锁模式。
EXCLUSIVE
与 ROW SHARE,ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE,SHARE ROW EXCLUSIVE, EXCLUSIVE 和 ACCESS EXCLUSIVE 模式冲突。 这个模式只允许并发 ACCESS SHARE 锁,也就是说, 只有对表的读动作可以和持有这个锁模式的事务并行执行。
任何 PostgreSQL 命令都不会在用户表上自动请求这样的锁模式. 不过,在有些操作的时候,会在某些系统表上请求它。
ACCESS EXCLUSIVE
与所有模式冲突。 ( ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, 和 ACCESS EXCLUSIVE). 这个模式保证其所有者(事务)是可以用任意方式访问该表的唯一事务。
ALTER TABLE, DROP TABLE,REINDEX,CLUSTER和 VACUUM FULL 命令要求这样的锁。 在 LOCK TABLE 命令没有明确声明需要的锁模式时,它也是缺省锁模式。
提示: 只有 ACCESS EXCLUSIVE 阻塞 SELECT (没有 FOR UPDATE/FOR SHARE语句)。