投资菜地

屋后的一亩三分绿色菜园地

2022-11-16

Postgre锁

PostgreSQL 锁机制浅析

Postgres 有行级锁,表级锁和页级锁,页级锁一般开发不需要关心。锁可以是显式的也可以是隐式的,一般建议性锁为显式的,隐式的锁是通过标准的 SQL 命令来获取。

表级锁

大多数的表级锁是由内置的 SQL 命令获得的,但他们也可以通过锁命令来明确获取。可使用的表级锁包括:

  • 访问共享(ACCESS SHARE) - SELECT 命令可在查询中引用的表上获得该锁。一般规则是所有的查询中只有读表才获取此锁。
  • 行共享(ROW SHARE) - SELECT FOR UPDATE 和 SELECT FOR SHARE 命令可在目标表上获得该锁(以及查询中所有引用的表的访问共享锁)。
  • 行独占(ROW EXCLUSIVE) - UPDATE、INSERT 和 DELETE 命令在目标表上获得该锁(以及查询中所有引用的表的访问共享锁)。 一般规则是所有修改表的查询获得该锁。
  • 共享更新独占(SHARE UPDATE EXCLUSIVE) - VACUUM(不含FULL),ANALYZE,CREATE INDEX CONCURRENTLY,和一些 ALTER TABLE 的命令获得该锁。
  • 共享(SHARE) - CREATE INDEX 命令在查询中引用的表上获得该锁。
  • 共享行独占(SHARE ROW EXCLUSIVE) - 不被任何命令隐式获取。
  • 排他(EXCLUSIVE) - 这个锁模式在事务获得此锁时只允许读取操作并行。它不能由任何命令隐式获取。
  • 访问独占(ACCESS EXCLUSIVE) - ALTER TABLE,DROP TABLE,TRUNCATE,REINDEX,CLUSTER 和 VACUUM FULL 命令在查询中引用的表上获得该锁。此锁模式是 LOCK 命令的默认模式。
--       SELECT pg_terminate_backend(20211);
select
    locktype,
    database,
    pid,
    relation,
    relname,
    mode
from pg_locks
    inner join pg_class on pg_class.oid = pg_locks.relation
    inner join pg_tables on pg_tables.tablename = pg_class.relname and pg_tables.schemaname LIKE 'gl_%'
where 1=1
     -- and pg_locks.mode = 'AccessShareLock'
	 -- and pg_locks.pid= 14345
order by
     pid,
     relname ;
	
    
    

开源项目(更多)