详解postgresql锁机制--表级锁,行级锁和建议性锁,值得收藏

亚洲通官网登录

锁机制在PostgreSQL中非常重要。对于DBA(尤其是涉及高并发代码的DBA),您需要熟悉锁。特别是对于某些问题,需要集中和检查锁。在大多数情况下,这些问题与死锁或数据不一致有关,并且主要是由于对Postgres的锁机制缺乏了解。

Postgres有三种锁机制:表级锁,行级锁和建议性锁。表级和行级锁可以是显式的,也可以是隐式的。建议的锁通常是明确的。通过显式用户请求(通过特殊查询)获取显式锁,并通过标准SQL命令获取隐式锁。

除了表级行级的锁之外,还有页级共享/排除锁,用于控制对共享缓存池中表页的访问。一旦读取或更新一行数据,就会释放这些锁。应用程序开发人员通常不需要关注页面级锁。

大多数表级锁是通过内置SQL命令获得的,但也可以通过锁命令显式获得。可用的表级锁包括:

访问共享(ACCESS SHARE) - SELECT命令获取查询中引用的表的锁一般规则是只有读取表在所有查询中获得锁定。行共享(ROW SHARE) - SELECT FOR UPDATE和SELECT FOR SHARE命令获取目标表上的锁(以及查询中所有引用表的访问共享锁)行独占(ROW EXCLUSIVE) - UPDATE,INSERT和DELETE命令target table获取锁(以及查询中所有引用表的访问共享锁)。一般规则是修改表的所有查询都获得锁定。共享更新独占(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命令的默认模式。

重要的是要知道所有这些锁都是表级锁,即使它们的名字中有ROW)。

每种锁定模式最重要的信息是相互冲突的模式列表。在同一个表中,2个事务不能同时保持冲突的锁定模式。交易永远不会与自身发生冲突。非冲突锁可以支持多个事务并发。知道某些模式与自身冲突也很重要。某些锁定模式会一直持续到事务结束。但是,如果在建立保存点后获得锁定,则在保存点回滚后将立即释放锁定。

下表显示了哪些模式存在冲突: