pgsql 的关系锁

pgsql 的关系锁

https://blog.51cto.com/u_15057829/2648894

 

以前在Percona上看到过一篇文章,里面有一个解析pg_locks的SQL语句。



SELECT pid, virtualtransaction AS vxid, locktype AS lock_type,mode AS lock_mode, granted,
CASE
WHEN virtualxid IS NOT NULL AND transactionid IS NOT NULL THEN virtualxid || ' ' || transactionid
WHEN virtualxid::text IS NOT NULL
THEN virtualxid
ELSE
   transactionid::text 
END AS xid_lock, relname,
page, tuple, classid, objid, objsubid
FROM pg_locks LEFT OUTER JOIN pg_class ON (pg_locks.relation = pg_class.oid)
WHERE  pid != pg_backend_pid();

 

 

#查看锁视图

select l.locktype,l.relation,l.pid,l.mode,l.granted,p.query_start,p.query,p.state 
from pg_locks l,pg_stat_activity p 
where l.locktype='relation' and l.pid=p.pid and query not like '%pg_stat_activity%' 

 

 

下面分别介绍一下这八种锁的场景:
1.AccessShare
在某个表上发出SELECT命令只读取表而不去修改它的查询都会获取该锁类型。
冲突级别:8



2.RowShare
SELECT FOR UPDATE/FOR SHARE命令会在目标表上取得一个这种模式的锁。
冲突级别:7,8



3.RowExclusive
在表上发出UPDATE、DELETE和INSERT要修改表中数据时会取得这种锁模式。
冲突级别:5,6,7,8



4.ShareUpdateExclusive
一些在线维护类操作所获得的锁,例如VACUUM(不带FULL)、ANALYZE、CREATE INDEX CONCURRENTLY、CREATE STATISTICS、ALTER TABLE VALIDATE等,该锁类型是自排他的。
冲突级别:4,5,6,7,8



5.Share
发出CREATE INDEX命令(不带CONCURRENTLY)取得该锁,注意该锁不是自排他的。
冲突级别:3,4,6,7,8



6.ShareRowExclusive
在以前老版本的官方文档中该锁不能通过发出某条数据库命令获得,而11以后的版本介绍该锁由CREATE COLLATION、CREATE TRIGGER和某些 ALTER TABLE命令获得。
冲突级别:3,4,5,6,7,8



7.Exclusive
这种锁模式只允许并发的AccessShare锁,持有该锁只允许该表的只读操作。在以前老版本的官方文档中该锁不能通过发出某条数据库命令获得,而11以后的版本介绍该锁由REFRESH MATERIALIZED VIEW CONCURRENTLY获得。
冲突级别:2,3,4,5,6,7,8



8.AccessExclusive
最高级别的锁,与所有模式的锁冲突,该锁保证持有者是访问该表的唯一事务。由DROP TABLE、TRUNCATE、REINDEX、CLUSTER、VACUUM FULL和REFRESH MATERIALIZED VIEW(不带CONCURRENTLY)命令获取。ALTER TABLE的某些命令也在会获得这种锁。同时,显式发出LOCK TABLE命令的默认锁模式也是该八级锁。
冲突级别:所有
值得注意的是savepoint之后获得的锁,在回退到保存点之前后该锁也会被事务释放。


-----------------------------------
©著作权归作者所有:来自51CTO博客作者mb5fd86a704dffe的原创作品,请联系作者获取转载授权,否则将追究法律责任
PostgreSQL中的八级锁
https://blog.51cto.com/u_15057829/2648894

posted @ 2022-06-08 18:36  huangchaolilli  阅读(227)  评论(0编辑  收藏  举报