注意PostgreSQL“隐式”锁请求

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介:
20151130105109316.jpg

我们在使用数据库时,经常遇到锁等待的事情。例如一个用户在更新一条记录时,另一个会话要更新同一条记录就需要等待。这种锁等待是比较显而易见的,有一些锁等待你可能会觉得匪夷所思。下面就由DBA+社群联合发起人周正中,跟大家聊聊这些“隐式”锁请求。

 

专家简介

  

20160328090217996.jpg
周正中

网名:德哥@Digoal

DBA+社群联合发起人


PostgreSQL中国社区发起人之一,负责杭州分会,兼任社区CTO一职。曾就职于斯凯网络,负责数据库部门。现就职于阿里巴巴,负责RDS PG内核组事务。

 

 

 

例如:


会话A:


20160328090223804.jpg


会话B:


select * from pg_get_indexdef('test_pkey'::regclass);  -- 查询索引的定义

如果test_pkey是test的一个索引,它会进入等待状态。


20160328090228887.jpg


我们来跟踪一下

首先请开启LOCK DEBUG。


会话A:


20160328090243672.jpg


会话B:


20160328090250823.jpg


等待中。


20160328090256736.jpg

20160328090303331.jpg


此时提交或回归会话A,然后会话B可以继续:


20160328090313822.jpg


正常情况下,查询索引定义如果没有被堵塞,观察到的锁是这样的:


20160328090320227.jpg


还有很多获得对象定义的函数,使用时需要注意。


20160328090327288.jpg


例如:

获取规则定义也要请求表的AccessShareLock。


20160328090334773.jpg


会话A:


20160328090341952.jpg


会话B:


20160328090346594.jpg


pg_get_viewdef也有这个问题,需要获得视图引用的表的AccessShareLock。


20160328090351432.jpg


另外再提供一个需要注意的点,PG对未获得,但是在等待中的锁也在冲突列表中。


例如用户1对A表在做一个比较大的查询,另一个用户2需要对A表执行DDL,那么显然用户2的DDL无法获得排它锁在等待用户1的状态。此后,用户3或其他用户发起对A的查询请求也会被用户2堵塞,这是非常危险的,如果用户1不释放锁,那么用户2就会一直等待,同时会堵塞所有对A表的任何请求。


所以建议用户在执行DDL操作时,加一个锁超时的参数,防止出现以上情况。


set lock_timeout='1s';


还有一种autocommit的场景下,建议对需要持有大锁的SQL在执行前加上语句超时,防止长时间持锁或等待锁,在某些场景甚至可能造成拥塞,例如短连接的场景,用户可能不断发起请求,把数据库连接用完。


set statement_timeout ='1s';


以上锁DEBUG信息都可以参考src/include/storage/lock.h获得详细的描述。

本文来自云栖社区合作伙伴"DBAplus",原文发布时间:2015-11-30
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
SQL 关系型数据库 RDS
验证RDS读写分离是否正确分发只读请求
目前RDS-Mysql支持开通读写分离,然后应用使用读写分离的地址提交请求的时候,就能够将符合条件的读请求分发到只读实例上执行,从而分担主实例上读请求的压力。
1549 0
|
关系型数据库 OLTP PostgreSQL
|
SQL 关系型数据库 OLTP
PostgreSQL数据库 OLTP高并发请求性能优化
在多核系统中,一般TPS会随并发数的增加而提升,但是当并发数超过一定的数值(如CPU核数的2到3倍以后),性能开始下降,并发数越高,下降越严重。
1722 0
|
9月前
|
SQL Cloud Native 关系型数据库
ADBPG(AnalyticDB for PostgreSQL)是阿里云提供的一种云原生的大数据分析型数据库
ADBPG(AnalyticDB for PostgreSQL)是阿里云提供的一种云原生的大数据分析型数据库
730 1
|
9月前
|
数据可视化 关系型数据库 MySQL
将 PostgreSQL 迁移到 MySQL 数据库
将 PostgreSQL 迁移到 MySQL 数据库
1050 2
|
11月前
|
SQL 关系型数据库 Linux
【PostgreSQL】基于CentOS系统安装PostgreSQL数据库
【PostgreSQL】基于CentOS系统安装PostgreSQL数据库
540 0
|
8月前
|
SQL 存储 自然语言处理
玩转阿里云RDS PostgreSQL数据库通过pg_jieba插件进行分词
在当今社交媒体的时代,人们通过各种平台分享自己的生活、观点和情感。然而,对于平台管理员和品牌经营者来说,了解用户的情感和意见变得至关重要。为了帮助他们更好地了解用户的情感倾向,我们可以使用PostgreSQL中的pg_jieba插件对这些发帖进行分词和情感分析,来构建一个社交媒体情感分析系统,系统将根据用户的发帖内容,自动判断其情感倾向是积极、消极还是中性,并将结果存储在数据库中。
玩转阿里云RDS PostgreSQL数据库通过pg_jieba插件进行分词
|
8月前
|
关系型数据库 测试技术 分布式数据库
PolarDB | PostgreSQL 高并发队列处理业务的数据库性能优化实践
在电商业务中可能涉及这样的场景, 由于有上下游关系的存在, 1、用户下单后, 上下游厂商会在自己系统中生成一笔订单记录并反馈给对方, 2、在收到反馈订单后, 本地会先缓存反馈的订单记录队列, 3、然后后台再从缓存取出订单并进行处理. 如果是高并发的处理, 因为大家都按一个顺序获取, 容易产生热点, 可能遇到取出队列遇到锁冲突瓶颈、IO扫描浪费、CPU计算浪费的瓶颈. 以及在清除已处理订单后, 索引版本未及时清理导致的回表版本判断带来的IO浪费和CPU运算浪费瓶颈等. 本文将给出“队列处理业务的数据库性能优化”优化方法和demo演示. 性能提升10到20倍.
595 4
|
9月前
|
SQL 存储 人工智能
NineData已支持「最受欢迎数据库」PostgreSQL
NineData 也在近期支持了 PostgreSQL,用户可以在 NineData 平台上进行创建数据库/Schema、管理用户与角色、导出数据、执行 SQL 等操作。另外,NineData SQL 开发企业版,还可以统一管理企业内部 PostgreSQL 的访问、规范与流程、变更发布等。
311 0
NineData已支持「最受欢迎数据库」PostgreSQL
|
9月前
|
存储 Cloud Native 关系型数据库
云原生之使用docker部署Postgresql数据库
云原生之使用docker部署Postgresql数据库
312 0
云原生之使用docker部署Postgresql数据库