暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL 12.2官方手册学习笔记(显示锁定之表级锁)

PostgreSQL数据库工作学习随笔 2021-12-10
440

显示锁定

    下面的列表显示了可用的锁模式和PostgreSQL自动使用它们的场合。你也可以用LOCK命令显式获得这些锁。请记住所有这些锁模式都是表级锁,即使它们的名字包含“row”单词(这些名称是历史遗产)。在一定程度上,这些名字反应了每种锁模式的典型用法 — 但是语意却都是一样的。两种锁模式之间真正的区别是它们有着不同的冲突锁模式集合。两个事务在同一时刻不能在同一个表上持有属于相互冲突模式的锁(但是,一个事务决不会和自身冲突。例如,它可以在同一个表上获得ACCESS EXCLUSIVE锁然后接着获取ACCESS SHARE锁)。非冲突锁模式可以由许多事务同时持有。请特别注意有些锁模式是自冲突的(例如,在一个时刻ACCESS EXCLUSIVE锁不能被多于一个事务持有)而其他锁模式不是自冲突的(例如,ACCESS SHARE锁可以被多个事务持有)。


表级锁模式


ACCESS SHARE


    只与ACCESS EXCLUSIVE锁模式冲突。

    

    SELECT命令在被引用的表上获得一个这种模式的锁。通常,任何只读取表而不修改它的查询都将获得这种锁模式。


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、SHARE ROW EXCLUSIVE、EXCLUSIVE和ACCESS EXCLUSIVE锁模式冲突。这种模式保护一个表不受并发模式改变和VACUUM运行的影响。

    

    由VACUUM(不带FULL)、ANALYZE、 CREATE INDEX CONCURRENTLY、REINDEX CONCURRENTLY、 CREATE STATISTICS以及某些ALTER INDEX和 ALTER TABLE的变体获得(完整的详细请参考ALTER INDEX 和ALTER TABLE)。



SHARE


    与ROW EXCLUSIVE、SHARE UPDATE EXCLUSIVE、SHARE ROW

    EXCLUSIVE、EXCLUSIVE和ACCESS EXCLUSIVE锁模式冲突。这种模式保护一个表不受并发数据改变的影响。由CREATE INDEX(不带CONCURRENTLY)取得。


SHARE ROW EXCLUSIVE

    

    与ROW EXCLUSIVE、SHARE UPDATE EXCLUSIVE、SHARE、SHARE ROW

EXCLUSIVE、EXCLUSIVE和ACCESS EXCLUSIVE锁模式冲突。这种模式保护一个表不受并发数据修改所影响,并且是自排他的,这样在一个时刻只能有一个会话持有它。

    

    由CREATE TRIGGER和某些形式的 ALTER TABLE所获得(见 ALTER TABLE)。


EXCLUSIVE


    与ROW SHARE、ROW EXCLUSIVE、SHARE UPDATE EXCLUSIVE、SHARE、SHARE ROWEXCLUSIVE、EXCLUSIVE和ACCESS EXCLUSIVE锁模式冲突。这种模式只允许并发的ACCESSSHARE锁,即只有来自于表的读操作可以与一个持有该锁模式的事务并行处理。

    

    由REFRESH MATERIALIZED VIEW CONCURRENTLY获得。


ACCESS EXCLUSIVE

    

    与所有模式的锁冲突(ACCESS SHARE、ROW SHARE、ROW EXCLUSIVE、SHARE UPDATE EXCLUSIVE、SHARE、SHARE ROW EXCLUSIVE、EXCLUSIVE和ACCESS EXCLUSIVE)。这种模式保证持有者是访问该表的唯一事务。


    由ALTER TABLE、DROP TABLE、TRUNCATE、REINDEX、CLUSTER、VACUUM FULL和REFRESH MATERIALIZED VIEW(不带CONCURRENTLY)命令获取。很多形式的ALTER INDEX和ALTER TABLE也在这个层面上获得锁(见ALTER TABLE)。这也是未显式指定模式的LOCK TABLE命令的默认锁模式。

    

提示只有一个ACCESS EXCLUSIVE锁阻塞一个SELECT(不带FOR UPDATE/SHARE)语句。


    一旦被获取,一个锁通常将被持有直到事务结束。但是如果在建立保存点之后才获得锁,那么在回滚到这个保存点的时候将立即释放该锁。这与ROLLBACK取消保存点之后所有的影响的原则保持一致。同样的原则也适用于在PL/pgSQL异常块中获得的锁:一个跳出块的错误将释放在块中获得的锁。


表 13.2. 冲突的锁模式



锁冲突我们已ACCESS EXCLUSIVE举例

session 1:

session 2:

执行select卡住不动

执行update卡住不动

session 1:

结束事务,释放锁

session 2:

update执行成功,可以看到一个两条数据的表更新一条数据用时8.122秒,大部分时间都在等待锁释放


后续会继续学习行级锁。

文章转载自PostgreSQL数据库工作学习随笔,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论