postgresql 锁小测验

pg锁介绍

AccessShareLock:是共享读锁,任何只读取表而不修改它的查询都将获得这种锁模式,此时不允许DDL
ExclusiveLock:文档没找到合适的解释,猜测是全局资源排他锁,对应每个事务的资源排他锁
RowShareLock:select for update ,select for share情况下会出现此锁,此时不允许DML和DDL
RowExclusiveLock:dml会产生此锁,此时不允许dml相同记录,也不允许DDL
AccessExclusiveLock: create、ALTER TABLE、DROP TABLE、TRUNCATE、REINDEX、CLUSTER、VACUUM FULL和REFRESH MATERIALIZED VIEW(不带CONCURRENTLY) 表会产生此锁。这种模式保证持有者是访问该表的唯一事务。此锁会阻塞查询
ShareUpdateExclusiveLock:由VACUUM(不带FULL)、ANALYZE、CREATE INDEX CONCURRENTLY、CREATE STATISTICS和ALTER TABLE VALIDATE以及其他ALTER TABLE的变体获得此锁,这种模式保护一个表不受并发模式改变和VACUUM运行的影响。
ShareLock:CREATE INDEX (WITHOUT CONCURRENTLY)会获得此锁,这种模式保护一个表不受并发数据改变的影响,即不能修改此表相关的数据和表结构。
ShareRowExclusiveLock:这种模式保护一个表不受并发数据修改所影响,并且是自排他的,这样在一个时刻只能有一个会话持有它。

AccessShareLock

场景一
session 1;
wjz=# begin;
BEGIN
wjz=# select * from test;
id

1
3
6
2
4
5
(6 rows)

session 2;
select a.pid,b.mode,a.query from pg_stat_activity a left join pg_locks b on a.pid=b.pid;
pid | mode | query
-------±----------------±-----------------------------------------------------------------------------------------
14906 | AccessShareLock | select * from test;
14906 | ExclusiveLock | select * from test;

发现查询除了AccessShareLock 外还有ExclusiveLock 。

RowShareLock

场景二
session 1;
wjz=# begin;
BEGIN
wjz=# select * from test for update;
id

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值