前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >PostgreSQL基础(十一):PostgreSQL的锁介绍

PostgreSQL基础(十一):PostgreSQL的锁介绍

原创
作者头像
Lansonli
发布2024-10-02 17:36:17
发布2024-10-02 17:36:17
40600
代码可运行
举报
文章被收录于专栏:Lansonli技术博客Lansonli技术博客
运行总次数:0
代码可运行

PostgreSQL的锁介绍

PostgreSQL中主要有两种锁,一个表锁一个行锁

PostgreSQL中也提供了页锁,咨询锁,但是这个不需要关注,他是为了锁的完整性。

一、表锁

表锁显而易见,就是锁住整张表。表锁也分为很多中模式。

表锁的模式很多,其中最核心的两个:

  • ACCESS SHARE:共享锁(读锁),读读操作不阻塞,但是不允许出现写操作并行
  • ACCESS EXCLUSIVE:互斥锁(写锁),无论什么操作进来,都阻塞。

具体的可以查看官网文档:http://postgres.cn/docs/12/explicit-locking.html

表锁的实现:

先查看一下语法

就是基于LOCK开启表锁,指定表的名字name,其次在MODE中指定锁的模式,NOWAIT可以指定是否在没有拿到锁时,一致等待。

代码语言:javascript
代码运行次数:0
复制
-- 111号连接
-- 基于互斥锁,锁住test表
-- 先开启事务
begin;
-- 基于默认的ACCESS EXCLUSIVE锁住test表
lock test in ACCESS SHARE mode;
-- 操作
select * from test;
-- 提交事务,锁释放
commit;

当111号连接基于事务开启后,锁住当前表之后,如果使用默认的ACCESS EXCLUSIVE,其他连接操作表时,会直接阻塞住。

如果111号是基于ACCESS SHARE共享锁时,其他线程查询当前表是不会锁住得。

二、行锁

PostgreSQL的行锁和MySQL的基本是一模一样的,基于select for update就可以指定行锁。

MySQL中有一个概念,for update时,如果select的查询没有命中索引,可能会锁表。

PostgerSQL有个特点,一般情况,在select的查询没有命中索引时,他不一定会锁表,依然会实现行锁。

PostgreSQL的行锁,就玩俩,一个for update,一个for share。 在开启事务之后,直接执行select * from table where 条件 for update;

代码语言:javascript
代码运行次数:0
复制
-- 先开启事务
begin;
-- 基于for update 锁住id为3的数据
select * from test where id = 3 for update;
update test set name = 'v1' where id = 3;
-- 提交事务,锁释放
commit;

其他的连接要锁住当前行,会阻塞住。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ​PostgreSQL的锁介绍
    • 一、表锁
    • 二、行锁
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档