pg锁介绍
AccessShareLock:是共享读锁,任何只读取表而不修改它的查询都将获得这种锁模式,此时不允许DDL
ExclusiveLock:文档没找到合适的解释,猜测是全局资源排他锁,对应每个事务的资源排他锁
RowShareLock:select for update ,select for share情况下会出现此锁,此时不允许DML和DDL
RowExclusiveLock:dml会产生此锁,此时不允许dml相同记录,也不允许DDL
AccessExclusiveLock: create、ALTER TABLE、DROP TABLE、TRUNCATE、REINDEX、CLUSTER、VACUUM FULL和REFRESH MATERIALIZED VIEW(不带CONCURRENTLY) 表会产生此锁。这种模式保证持有者是访问该表的唯一事务。此锁会阻塞查询
ShareUpdateExclusiveLock:由VACUUM(不带FULL)、ANALYZE、CREATE INDEX CONCURRENTLY、CREATE STATISTICS和ALTER TABLE VALIDATE以及其他ALTER TABLE的变体获得此锁,这种模式保护一个表不受并发模式改变和VACUUM运行的影响。
ShareLock:CREATE INDEX (WITHOUT CONCURRENTLY)会获得此锁,这种模式保护一个表不受并发数据改变的影响,即不能修改此表相关的数据和表结构。
ShareRowExclusiveLock:这种模式保护一个表不受并发数据修改所影响,并且是自排他的,这样在一个时刻只能有一个会话持有它。
AccessShareLock
场景一
session 1;
wjz=# begin;
BEGIN
wjz=# select * from test;
id
1
3
6
2
4
5
(6 rows)
session 2;
select a.pid,b.mode,a.query from pg_stat_activity a left join pg_locks b on a.pid=b.pid;
pid | mode | query
-------±----------------±-----------------------------------------------------------------------------------------
14906 | AccessShareLock | select * from test;
14906 | ExclusiveLock | select * from test;
发现查询除了AccessShareLock 外还有ExclusiveLock 。