ROW SHARE:SELECT FOR UPDATE 和 SELECT FOR SHARE 命令在
目标表上取得一个这种模式的锁 (加上在被引用但没有选择 FOR
UPDATE/FOR SHARE 的任何其他表上的 ACCESS SHARE 锁)。
ROW EXCLUSIVE:命令 UPDATE、DELETE 和 INSERT 在目标表上取得
这种锁模式(加上在任何其他被引用表上的 ACCESS SHARE 锁)。通
常,这种锁模式将被任何修改表中数据的命令取得。
SHARE UPDATE EXCLUSIVE:由 VACUUM(不带 FULL)、ANALYZE、
CREATE INDEX CONCURRENTLY、REINDEX CONCURRENTLY、
CREATE STATISTICS 以及某些 ALTER INDEX 和 ALTER TABLE 的变体
获得(详细内容请参考这些命令的文档)。
SHARE:由 CREATE INDEX(不带 CONCURRENTLY)取得。
SHARE ROW EXCLUSIVE:由 CREATE TRIGGER 和某些形式的 ALTER
TABLE 所获得。
EXCLUSIVE:由 REFRESH MATERIALIZED VIEW CONCURRENTLY 获
得。
ACCESS EXCLUSIVE:由 ALTER TABLE、DROP TABLE、
TRUNCATE、REINDEX、CLUSTER、VACUUM FULL 和 REFRESH
MATERIALIZED VIEW(不带 CONCURRENTLY)命令获取。很多形
式的 ALTER INDEX 和 ALTER TABLE 也在这个层面上获得锁(见
ALTER TABLE(7))。这也是未显式指定模式的 LOCK TABLE 命令的
默认锁模式。
表级锁一旦被获取,一个锁通常将被持有直到事务结束。但是如果在建立保存
点之后才获得锁,那么在回滚到这个保存点的时候将立即释放该锁。这与
ROLLBACK 取消保存点之后所有的影响的原则保持一致。同样的原则也适用于
在 PL/pgSQL 异常块中获得的锁:一个跳出块的错误将释放在块中获得的锁。
下表 13.2 冲突的锁模式
评论