开发者社区> 德哥> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

PostgreSQL 使用advisory lock实现行级读写堵塞

简介:
+关注继续查看

标签

PostgreSQL , select for update , 读写冲突 , 读写堵塞 , advisory lock


背景

PostgreSQL的读写是不冲突的,这听起来是件好事对吧,读和写相互不干扰,可以数据库提高读写并发能力。

但是有些时候,用户也许想让读写冲突(需求:数据正在被更新或者删除时,不允许被读取)。

那么有方法能实现读写冲突吗?

PostgreSQL提供了一种锁advisory lock,可以实现读写堵塞的功能。

使用advisory lock实现行级读写堵塞

1. 创建表,注意使用一个唯一ID(用于advisory lock)

postgres=# create table ad_test(id int8 primary key, info text, crt_time timestamp);
CREATE TABLE

2. 插入测试数据

postgres=# insert into ad_test values (1,'test',now());
INSERT 0 1

3. 会话1,更新某一条记录

postgres=# begin;
BEGIN
postgres=# update ad_test set info='abc' where id=1;
UPDATE 1

4. 会话2,读这条记录

postgres=# select * from ad_test ;
 id | info |          crt_time          
----+------+----------------------------
  1 | test | 2017-05-07 15:57:42.201804
(1 row)

使用以上常规的方法,读写是不冲突的。

5. 会话1,更新这条记录的同时,使用advisory lock锁住这个ID

postgres=# begin;
BEGIN
postgres=# update ad_test set info='abc' where id=1 returning pg_try_advisory_xact_lock(id);
 pg_try_advisory_xact_lock 
---------------------------
 t
(1 row)

UPDATE 1

6. 会话2,查询这条记录时,使用advisory lock探测这条记录,如果无法加锁,返回0条记录。从而实现读写堵塞(实际上是隔离)。

postgres=# select * from ad_test where id=1 and pg_try_advisory_xact_lock(1);
 id | info | crt_time 
----+------+----------
(0 rows)

使用advisory lock,实现了读写冲突的需求(实际上是让读的会话读不到被锁的记录)。

adlock使用注意

advisory lock锁住的ID,是库级冲突的,所以使用时也需要注意哟。

advisory lock相关函数API的详细介绍

https://www.postgresql.org/docs/9.6/static/explicit-locking.html#ADVISORY-LOCKS

https://www.postgresql.org/docs/9.6/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS

advisory lock的其他应用

1. 《PostgreSQL upsert功能(insert on conflict do)的用法》

2. 《PostgreSQL 无缝自增ID的实现 - by advisory lock》

3. 《PostgreSQL 使用advisory lock或skip locked消除行锁冲突, 提高几十倍并发更新效率》

4. 《聊一聊双十一背后的技术 - 不一样的秒杀技术, 裸秒》

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
RDS审计中心--数据库安全监控利器
依托阿里云SLS日志服务及阿里云RDS SQL审计,以极低的代价采集对SQL执行的所有操作,RDS审计中心提供丰富的内置告警规则,覆盖绝大部分场景的安全、运营、性能报表,只需要做最少的配置即可实现对数据库的全方位监控。
619 0
商业化十周年,阿里云RDS推出企业级自治数据库
近日,阿里云宣布RDS数据库品牌升级计划,推出云原生企业级自治数据库。今天也是阿里云RDS商业化十周年。据了解,阿里云是国内首家提供自治服务的数据库厂商,基于人工智能和机器学习技术,阿里云RDS数据库提供自动升级、自动调优等100%数据库自动驾驶能力。云原生数据库2.0时代,阿里云RDS通过企业级的自治能力为客户提供更快、更稳、更安全的数据库服务。
744 0
免费享受同城双可用区高可用容错能力!阿里云云数据库RDS新增可用区6月汇总(内含福利)
6月份,阿里云云数据库 MySQL 版,云数据库 PPAS 版,云数据库 SQL Server 版,云数据库 PostgreSQL 版均宣布新增可用区,用户在控制台上按需求创建实例,即可享受同城双可用区高可用容错能力。接下来小编将为大家详细列出新增可用区。
2729 0
MSSQL · 最佳实践 · 实例级别数据库上云RDS SQL Server
摘要 到目前,我们完成了SQL Server备份还原专题系列八篇月报分享:三种常见的数据库备份、备份策略的制定、查找备份链、数据库的三种恢复模式与备份之间的关系、利用文件组实现冷热数据隔离备份方案、如何监控备份还原进度、阿里云RDS SQL自动化迁移上云的一种解决方案以及上个月分享的RDS SDK实现数据库迁移上阿里云,本期我们分享如何将用户线下或者ECS上自建实例级别数据库一键迁移上阿里云RDS SQL Server。
1675 0
阿里云云数据库RDS秒级监控功能解锁,通宵加班找故障将成为过去式
每一个奋斗在前线的数据库管理员和运维人员似乎运气都不太好,这些人都绝对经历过的诡异事件就是:逢年过节必出故障,明明眼看着要休假了,又接到故障通知,只好通宵加班找问题。没问题的时候可能大家都不会想到你,一出问题就先拿运维试问,于是每逢佳节便出现拜数据库的戏谑图片。
2716 0
重磅干货免费下载!阿里云RDS团队论文被数据库顶会SIGMOD 2018收录
来自阿里云RDS团队的论文“**TcpRT: Instrument and Diagnostic Analysis System for Service Quality of Cloud Databases at Massive Scale in Real-time” (TcpRT:面向大规模海量云数据库的服务质量实时采集与诊断系统)**被数据库顶会SIGMOD 2018收录。
10381 0
参与 API 创新应用大赛,体验RDS CloudDBA数据库性能优化 API
阿里云的RDS数据库,有开发者所需要的一系列的功能,但很多功能很多开发者可能并没有使用过。这里,介绍一个RDS比较有用的功能:CloudDBA数据库性能优化 API。
12948 0
同步RDS数据库到自建mysql数据库
同步RDS数据库到自建mysql数据库
4410 0
从运维的角度分析使用阿里云数据库RDS的必要性--你不应该在阿里云上使用自建的MySQL/SQL Server/Oracle/PostgreSQL数据库
开宗明义,你不应该在阿里云上使用自建的MySQL or SQL Server数据库,对了,还有Oracle or PostgreSQL数据库。 云数据库 RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务。
4454 0
+关注
德哥
公益是一辈子的事, I am digoal, just do it.
文章
问答
来源圈子
更多
让用户数据永远在线,让数据无缝的自由流动
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
为什么PostgreSQL是最适合去O的数据库
立即下载
认识PostgreSQL中与众不同的索引
立即下载
PolarDB for PostgreSQL三节点功能介绍
立即下载