• 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

  • 相关阅读:
    OO设计的开闭原则
    OO设计的接口分隔原则
    玩大数据需要知道的12个工具
    怎么回答哪个更快的问题
    C#用extern alias解决两个assembly中相同的类型全名
    CoffeeScript, Ruby 和 C++的复杂度比较
    用python替代javascript?
    C#的内存模型和并发情况下受到的影响
    怎么看C++对象的内存结构 和 怎么解密C++的name mangling
    .NET中使用Unity和StructureMap来实现依赖注入Dependency Injection
  • 原文地址:https://www.cnblogs.com/MYSQLZOUQI/p/16356768.html
Copyright © 2020-2023  润新知