PG系列:Select查询一样会被阻塞
我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
在之前的理解中SELECT语句只会在对象上获取共享锁,在行上面由于MVCC机制不会申请任何锁,所以SELECT语句不会被阻塞。在PG环境中SQL语句申请的对象级别的锁类型是relation,SELECT语句仍然需要在表上面申请共享访问级别的relation锁,在遇到访问排它锁争用的情况,就会出现SELECT语句一样被阻塞,所以此时就出现了SELECT被阻塞的现象。这种现象可以非常容易的模拟出来。
模拟行级排它锁
这里通过更新同一行就可以模拟行级排它锁。
会话一:
postgres_1721@postgres > update big_table set id=12313123121212312 where id=1;
UPDATE 1
Time: 0.788 ms
会话二:
postgres_1721@postgres > update big_table set data2='1473c5de4ec1d74cce391fd78b1601fb' where id=1;
查看锁的信息:
postgres_1721@postgres > \i block.sql
-[ RECORD 1 ]-+--------------------------------------------------------------------------
pid | 2399
usename | postgres
datname | postgres
state | idle in transaction
wait_event | Client: ClientRead
time_state_s | 2111
time_xact_s | 2111
locked_object |
locktype |
mode |
h_p_t |
w_p_t |
blocking_pids |
last_session |
lock_depth | 2399.0
query | RELEASE pg_psql_temporary_savepoint
-[ RECORD 2 ]-+--------------------------------------------------------------------------
pid | 2760
usename | postgres
datname | postgres
state | active
wait_event | Lock: transactionid
time_state_s | 2250
time_xact_s | 2250
locked_object | transactionid
locktype | transactionid
mode | ShareLock
h_p_t |
w_p_t | big_table:0:1
blocking_pids | {2399}
last_session | 2399
lock_depth | 2399.1
query | update big_table set data2='1473c5de4ec1d74cce391fd78b1601fb' where id=1;
这里可以看到2760会话因为transactionid锁而被阻塞。
模拟访问排它锁
在上面的情况下执行表的DDL语句即可以模拟出访问排它锁
会话三:
postgres_1721@postgres > alter table big_table add column data4 text;
hang住了
查看阻塞的信息:
postgres_1721@postgres > \i block.sql
-[ RECORD 1 ]-+--------------------------------------------------------------------------
pid | 2399
usename | postgres
datname | postgres
state | idle in transaction
wait_event | Client: ClientRead
time_state_s | 757
time_xact_s | 757
locked_object |
locktype |
mode |
h_p_t |
w_p_t |
blocking_pids |
last_session |
lock_depth | 2399.0
query | RELEASE pg_psql_temporary_savepoint
-[ RECORD 2 ]-+--------------------------------------------------------------------------
pid | 2760
usename | postgres
datname | postgres
state | active
wait_event | Lock: transactionid
time_state_s | 617
time_xact_s | 617
locked_object | transactionid
locktype | transactionid
mode | ShareLock
h_p_t |
w_p_t | big_table:0:1
blocking_pids | {2399}
last_session | 2399
lock_depth | 2399.1
query | update big_table set data2='1473c5de4ec1d74cce391fd78b1601fb' where id=1;
-[ RECORD 3 ]-+--------------------------------------------------------------------------
pid | 2592
usename | postgres
datname | postgres
state | active
wait_event | Lock: relation
time_state_s | 13
time_xact_s | 2867
locked_object | big_table
locktype | relation
mode | AccessExclusiveLock
h_p_t |
w_p_t |
blocking_pids | {2760,2399}
last_session | 2399
lock_depth | 2760.3
query | alter table big_table add column data4 text;
这里alter的语句申请对象的big_table的访问排它锁而被阻塞了。
SELECT语句被阻塞
任一执行一条SQL语句:
会话四:
postgres_1721@postgres > \i mypid.sql
pg_backend_pid
----------------
2861
(1 row)
Time: 0.612 ms
postgres_1721@postgres > select * from big_table limit 1;
hang住了。
查询阻塞的信息:
-[ RECORD 3 ]-+--------------------------------------------------------------------------
pid | 2861
usename | postgres
datname | postgres
state | active
wait_event | Lock: relation
time_state_s | 111
time_xact_s | 126
locked_object | big_table
locktype | relation
mode | AccessShareLock
h_p_t |
w_p_t |
blocking_pids | {2592}
last_session | 2592
lock_depth | 2592.2
query | select * from big_table limit 1;
-[ RECORD 4 ]-+--------------------------------------------------------------------------
相比之前的记录会多出上面的信息,select语句申请big_table访问共享锁时被阻塞了。
总结
通过上面的列子中其实可以看到SELECT语句一样的会被阻塞,不过在PG环境中SELECT的阻塞分析起来比Oracle还要更简单一些,因为在Oracle中元数据的锁不会出现在v$lock中而是出现在dba_kgllock中,同时event也是显示的元数据等待事件,相比PG来说这点会更直观很多。
------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

PG系列:Select查询一样会被阻塞的更多相关文章
- 关于SubSonic3.0插件使用SqlQuery或Select查询时产生的System.NullReferenceException异常修复
早上在编写执行用例时,突然爆异常System.NullReferenceException: 未将对象引用设置到对象的实例 执行代码:
- 为什么忘记commit也会造成select查询的性能问题
今天遇到一个很有意思的问题,一个开发人员反馈在测试服务器ORACLE数据库执行的一条简单SQL语句非常缓慢,他写的一个SQL没有返回任何数据,但是耗费了几分钟的时间.让我检查分析一下原因,分析解决过后 ...
- [NHibernate]N+1 Select查询问题分析
目录 写在前面 文档与系列文章 N+1 Select查询问题分析 总结 写在前面 在前面的文章(延迟加载,立即加载)中都提到了N+1 Select的问题,总觉得理解的很不到位,也请大家原谅,这也是为什 ...
- Sql Server来龙去脉系列之三 查询过程跟踪
我们在读写数据库文件时,当文件被读.写或者出现错误时,这些过程活动都会触发一些运行时事件.从一个用户角度来看,有些时候会关注这些事件,特别是我们调试.审核.服务维护.例如,当数据库错误出现.列数据被更 ...
- select查询的性能
为什么忘记commit也会造成select查询的性能问题 今天遇到一个很有意思的问题,一个开发人员反馈在测试服务器ORACLE数据库执行的一条简单SQL语句非常缓慢,他写的一个SQL没有返回任何数据, ...
- 忘记commit也会造成select查询的性能问题
今天遇到一个很有意思的问题,一个开发人员反馈在测试服务器ORACLE数据库执行的一条简单SQL语句非常缓慢,他写的一个SQL没有返回任何数据,但是耗费了几分钟的时间.让我检查分析一下原因,分析解决过后 ...
- Mysql常用sql语句(3)- select 查询语句基础使用
测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 针对数据表里面的每条记录,select查询语句叫 ...
- Elasticsearch使用系列-基本查询和聚合查询+sql插件
Elasticsearch使用系列-ES简介和环境搭建 Elasticsearch使用系列-ES增删查改基本操作+ik分词 Elasticsearch使用系列-基本查询和聚合查询+sql插件 Elas ...
- Sql Server系列:查询分页语句
1 利用临时表分页 分页存储过程: CREATE PROCEDURE [USP_Product_GetPaged] ), ), @PageIndex INT, @PageSize INT AS BEG ...
- access数据库select查询top时无效的解决办法
access数据库select查询top时有时无效,原因就是在使用Order by时,且排序的条件中数据有重复的. 比如:select top 10 * from table1 order by cd ...
随机推荐
- numpy.ndarray.transpose用法理解
numpy.ndarray.transpose方法对于高维数组来讲,略微有点不太好理解.下面给出我自己对该方法的理解. 对于一个高维数组,transpose((i,j,k))可以这样理解:选取原数组的 ...
- Java 自定义线程池的任务
在<Java 自定义线程池的线程工厂>一文中介绍了如何优雅地自定义线程工厂,本文介绍如何自定义线程池的任务,并拿到返回值. 首先自定义一个任务类,实现Callable接口,重写ca ...
- java实现一个接口多个实现类,并且调用指定实现方法@Service
接口 package cn.daenx.framework.notify.sms.service; import cn.daenx.framework.common.vo.system.utils.S ...
- k8s | 重启Kubernetes Pod的几种方式
前言 在使用 docker 的过程中,我们可以使用docker restart {container_id}来重启容器,但是在 kubernetes 中并没有重启命令(没有 kubectl resta ...
- 【目录】【中文】【deplearning.ai】【吴恩达课后作业目录】
[目录][吴恩达课后作业目录] 吴恩达深度学习相关资源下载地址(蓝奏云) 课程 周数 名称 类型 语言 地址 课程1 - 神经网络和深度学习 第1周 深度学习简介 测验 中英 传送门 无编程作业 编程 ...
- JavaWeb 中的 HTTP 基础知识
概念:超文本传输协议,规定了浏览器和服务器之间数据传输的规则. 特点: 基于TCP协议,面向连接,更安全 基于请求-响应模型,一次请求对应一次响应 是无状态的协议,对事务处理没有记忆能力.每次请求-响 ...
- MybatisPlus实现插入或更新数据时自动生成时间戳
MybatisPlus实现插入或更新数据时,自动生成时间戳功能 数据库表对应字段的类型应该是 DateTime 或者 timestamp 我需要在插入或更新数据时,为create_time字段自动生成 ...
- From Small Not Perfect
自己想实现一个共享文档,然后统计每个人每周做题的数量,然后还想到每个月的统计,每年的统计,哇,好复杂哈 所以我想先做一个Excel,然后开始使用,中间发现了问题,然后调整,修改. 当我做了这个Exce ...
- 超实用!10 个 Excel 数据验证技巧,轻松解决数据录入难题
[Excel基础系列之十二] 嗨,宝子们,我是社会牛马"表哥"--EETools. 在数据管理与日常办公中,Excel 数据验证如同一位 "数据质检员",从源头 ...
- Office 2024 专业增强版超详细下载安装教程(附安装包)
目录 一.Office 2024 专业增强版软件简介 二.Office 2024 专业增强版安装准备 三.Office 2024 专业增强版安装步骤 下载Office 2024安装包: 运行Offic ...