PG基础篇–逻辑结构管理(锁机制–表锁)

pg的锁有两类,表级锁和行级锁。

表级锁

表级锁分类

ACCESS  SHARE

只读表不修改表申请该锁模式

ROW SHARE

select for update 和select for share 申请该锁模式

ROW EXCLUSIVE

DML申请该锁模式

SHARE UPDATE EXCLUSIVE

VACUUM、ANALYZE、CREATE INDEX CONCURRENTLY申请该锁模式

SHARE

create index 申请该锁模式

SHARE ROW EXCLUSIVE

不会主动申请

EXCLUSIVE

不会主动申请

ACCESS EXCLUSIVE

alter table ,drop table,truncate,reindex ,vacuum full 申请该模式的锁

表级锁概述

表级锁只有share和EXCLUSIVE两种,也就是读和写锁,share读锁加上后不能修改表,加锁exclusive写锁后不能读也不能写,但是在多版本功能后,修改某一行数据,实际上并没有改变原来那一行,而是另复制了一行数据,修改在新行上进行,事务不提交,别人是看不到修改行的,就没有必要阻塞其他用户读数据了。

在多版本功能下,ACCESS share 表明加上这个锁,即使是正在修改数据的情况下,也允许读数据,另一个锁ACCESS EXCLUSIVE 即使多版本功能,也不允许访问数据。

意向锁

表级锁的锁粒度太大,出现了行级锁,mysql获得行锁之前需要获取意向锁,pg中类似mysql也有ROW_SHARE 和ROW_EXCLUSIVE锁。

意向锁之间不会冲突,意向锁和非意向锁的冲突兼容关系和普通锁之间关系一样。可以简单转换为X和S,在比较是否兼容。

SHARE UPDATE EXCLUSIVE

就是把IX锁之间的不兼容变为更严格的一种锁,针对不带FULL的VACUUM,CREATE INDEX CONCURRENTLY都会申请该锁。

SHAER ROW EXCLUSIVE

等同于加了S锁和IX锁

表锁总结

PG中共8种锁,共享锁SHARE 和排它锁EXCLUSIVE ,因为多版本的原因修改数据的同事允许读数据,于是有了ACCESS SHARE和ACCESS EXCLUSIVE锁。

为了处理表锁和行锁之间的关系,欧了意向锁的概念,ROW_SHARE 和ROW_EXCLUSIVE锁,但是意向锁之间不会冲突,为了更严格,出现了SHARE

UPDATE EXCLUSIVE和 SHARE ROW EXCLUSIVE锁。

发表评论

相关文章