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 ;