PG的锁(一)

太阳2年前技术文章723

一、表级锁

1.1 表级锁模式

常见锁模式以及应用场景:

  • ACCESS SHARE :select操作获取该模式锁资源,通常情况下所有只读取不修改表的查询都会获取该模式锁资源

  • ROW SHARE : select for update 和 select for share 命令获取该模式锁资源

  • ROW EXCLUSIVE : DML操作通过会获取该模式锁资源,通常情况下任何需要修改表数据的操作都会持有该模式锁资源

  • SHARE UPDATE EXCLUSIVE :对于 vacuum(非full)、create index concurrnetly、reindex concurrently、create statistics、alter index相关、alter table相关操作会持有该模式锁资源,该模式锁资源主要是为了范围并发对同一张表DDL变更以及vacuum操作

  • SHARE : create index (非concurrently)操作会持有该模式锁资源,该模式锁资源可阻止并发对表的创建索引操作

  • SHARE ROW EXCLUSIVE : cerate trigger、一些alter table操作会持有该模式锁资源

  • EXCLUSIVE : refresh materialized view concurrently操作会持有该模式锁资源

  • ACCESS EXCLUSIVE :lock table模式锁定模式,drop table、truncate、reindex、 cluster、vacuum full、refresh materialized view (without concurrently) 还有一些alter table、alter index操作需要获取该模式锁资源,该模式锁资源保证了持有者唯一访问表。


1.2 表级锁兼容性

锁模式

ACCESS SHARE

ROW SHARE

ROW EXCLUSIVE

SHARE UPDATE EXCLUSIVE

SHARE

SHARE ROW EXCLUSIVE

EXCLUSIVE

ACCESS EXCLUSIVE

ACCESS SHARE








X

ROW SHARE







X

X

ROW EXCLUSIVE





X

X

X

X

SHARE UPDATE EXCLUSIVE




X

X

X

X

X

SHARE



X

X


X

X

X

SHARE ROW EXCLUSIVE



X

X

X

X

X

X

EXCLUSIVE


X

X

X

X

X

X

X

ACCESS EXCLUSIVE

X

X

X

X

X

X

X

X


二、行级锁

2.1 行级锁模式

常见锁模式以及应用场景:

  • FOR UPDATE :对于所有的for update操作,对于被检索的数据行进行for update行锁锁定,阻止其他事务对持有for update行锁记录进行更新。在RR和SERIALIZABLE隔离级别下,如果一个被for update锁定的行在当前事务开始后被修改,该事务会抛出异常报错。对于update、delete操作同样需要获取for update行模式锁

  • FOR NO KEY UPDATE :与for update行模式锁类似,但是其锁范围相对较弱。对于不需要获取 for update 行锁资源的所有delete、update操作都会持有该行模式锁。在RR和SERIALIZABLE隔离级别下,如果一个被for update锁定的行在当前事务开始后被修改,该事务会抛出异常报错。

  • FOR SHARE : 对于检索记录添加share lock,该模式锁资源会阻塞其他事务对持有锁记录进行delete、update、select for update、for no key update,但允许其他事务并发添加for share或者for key share

  • FOR KEY SHARE : 相对于for share,该模式锁相对更加弱一些,他允许其他事务并发持有for no key update模式锁资源

2.2 行级锁兼容性

锁模式

FOR KEY SHARE

FOR SHARE

FOR NO KEY UPDATE

FOR UPDATE

FOR KEY SHARE




X

FOR SHARE



X

X

FOR NO KEY UPDATE


X

X

X

FOR UPDATE

X

X

X

X

2.3 锁测试

1、RR隔离级别下 for update 测试

事务一

事务二

-

START TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-

select id from t1 where id2=327;//id=2,6240

START TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-

-

update t1 set info ='aaaaaaaaa' where id=2;

select * from t1 where id2=327 for update;//被夯住

-

-

commit;

select for update抛出异常报错“ERROR:  could not serialize access due to concurrent update”


for no key update操作也会出现相同的报错提示。

三、页面级锁

  • page-level share/exclusive : 控制对shared buffer pool中数据页的读写操作,在获取对应需要查询或者更新的行记录后会立即释放页面级别锁。应用开发者通常不需要关心页级锁。


标签: PostgreSQL

相关文章

PG初识

PG数据库是一种典型的C/S模型应用,不同的客户端通过TCP/IP进行连接、每个连接启动一个fork进程(多进程数据库)。一、pg逻辑架构1.1 pg与MySQL异同对比逻辑架构postgresMyS...

REPMGR-PG高可用搭建(三)

REPMGR-PG高可用搭建(三)

2.2.2repmgr安装兼容性3节点均安装repmgr1.安装依赖 # yum install flex 2.下载解压 # wget -c https://repmgr.org/downloa...

PG查询性能Top SQL

一、查询当前正在运行的Top SQL    查询当前正在运行的会话中耗时最长的Top SQL,where条件可按需修改SELECT pgsa.datname AS database_name    ...

PG的统计信息(一)

一、统计信息1.1 PG统计信息概述pg的统计信息主要分为两种:第一类统计信息是是负载指标“统计信息”(Monitoring stats),通过stat collector进程进行实时采集更新的负载指...

REPMGR-PG高可用搭建(二)

REPMGR-PG高可用搭建(二)

REPMGR搭建步骤一、介绍repmgr是第二象限开源的一套流复制集群管理工具,用于管理PostgreSQL服务器群集中的复制和故障转移。 支持故障自动转移和手动切换;支持分布式管理集群节点,易扩展,...

pg_restore

逻辑备份恢复PG提供了pg_restore的命令可以为通过pg_dump转储的数据进行逻辑恢复。对于SQL脚本可通过psql进行恢复语法pg_restore [connection_option] [...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。