曲演杂坛--为什么SELECT语句会被其他SELECT阻塞?
很多刚入门的DBA在捕获阻塞得时候,会问这么一个问题“为什么这个SELECT语句被那个SELECT语句阻塞了,难道不是共享锁么?”
让我们来做个小测试,首先准备一些测试数据:
--======================================
--准备测试数据
SELECT
ROW_NUMBER()OVER(ORDER BY object_id) AS RID,
name AS C1
INTO TB003
FROM sys.all_columns
GO
CREATE UNIQUE CLUSTERED INDEX IDX_RID ON TB003(RID)
注意上面创建的表中RID是唯一聚集索引,因此如果我们按照RID来进行更新或查询,会加行锁。
首先开启一个事务来修改数据:
--==============================
--开启事务,修改一条数据不提交
--使得该回话长期持该行上的X锁
BEGIN TRAN UPDATE TB003
SET C1='ABC'
WHERE RID=110
然后再分别开启两个回话,进行数据查询:
SELECT * FROM TB003 WHERE RID=110
可以看到两个查询都处于运行状态,迟迟没有返回数据,使用dm_exec_request来查看阻塞:
--====================================
--查看正在执行的SQL的阻塞情况
SELECT
R.session_id,
R.command,
R.blocking_session_id,
R.wait_type,
R.wait_resource
FROM sys.dm_exec_requests AS R
WHERE R.session_id>55
AND R.session_id<>@@SPID
查询结果:
于是就有人开始疑问了,为啥SELECT阻塞SELECT呢?
其实这只是一个先来后到的问题,会话62执行时请求锁KEY: 10:72057594043695104 (8c752d5f60d8),发现锁被会话59占着,然后就开始等,会话63这时候冒出来,也请求同样的锁,发现锁被59占着,也开始等,只是由于会话62已经做沙发上等着,于是老老实实搬个板凳坐着等,由于怨恨会话62先到占了沙发,所以把会话62列为自己的阻塞对象,期待这会话62早点被干掉,让自己坐上沙发。。。。
以上逗逼一下,只是告诉各位小伙伴,blocking_session_id这个值有点不靠谱,主要还得看资源情况,谁真正持有资源谁才是真正阻塞别人的!
如果想看阻塞的真正源头,可以使用下面脚本:
--=================================================================
--查看阻塞链
WITH T1 AS (
SELECT S.session_id ,
ISNULL(RS.blocking_session_id , 0) AS blocking_session_id ,
CAST('' AS NVARCHAR(200)) AS BlockStep ,
0 AS BlockNum
FROM [sys].[dm_exec_sessions] AS S WITH ( NOLOCK )
LEFT JOIN [sys].[dm_exec_requests] RS WITH ( NOLOCK )
ON S.session_id = RS.session_id
WHERE S.session_id IN (
SELECT RS1.blocking_session_id
FROM [sys].[dm_exec_requests] RS1 )
AND ISNULL(RS.blocking_session_id , 0) = 0
UNION ALL
SELECT RS.session_id ,
RS.blocking_session_id ,
CAST(( '-->'
+ CAST(RS.blocking_session_id AS NVARCHAR(200))
+ T1.BlockStep ) AS NVARCHAR(200)) AS BlockStep ,
1 + T1.BlockNum AS BlockNum
FROM [sys].[dm_exec_requests] RS
INNER JOIN T1
ON RS.blocking_session_id = T1.session_id
)
SELECT session_id ,
blocking_session_id ,
( CASE WHEN T1.BlockStep = ''
THEN 'KILL ' + CAST(T1.session_id AS NVARCHAR(200))
ELSE T1.BlockStep
END ) AS BlockStep ,
BlockNum
FROM T1
执行结果:
--===============================================
--没啥高大上的东西,弄点科普的贴子,以便发图,哇咔咔!!!
曲演杂坛--为什么SELECT语句会被其他SELECT阻塞?的更多相关文章
- 曲演杂坛--一条DELETE引发的思考
原文:曲演杂坛--一条DELETE引发的思考 场景介绍: 我们有一张表,专门用来生成自增ID供业务使用,表结构如下: CREATE TABLE TB001 ( ID ,) PRIMARY KEY, D ...
- 曲演杂坛--EXISTS语句
通常在我写EXISTS语句时,我会写成IF EXISTS(SELECT TOP(1) 1 FROM XXX),也没细细考究过为什么要这么写,只是隐约认为这样写没有啥问题,那今天就深究下吧! 首先准备测 ...
- 曲演杂坛--当ROW_NUMBER遇到TOP
值班期间研发同事打来电话,说应用有超时,上服务器上检查发现有SQL大批量地执行,该SQL消耗IO资源较多,导致服务器存在IO瓶颈,细看SQL,发现自己都被整蒙了,不知道这SQL是要干啥,处理完问题赶紧 ...
- 曲演杂坛--Update的小测试
今天偶然想起一个UPDATE相关的小问题,正常情况下,如果我们将UPDATE改写成与之对应的SELECT语句,其SELECT查询结果应与UPDATE的目标表存在一对一的关系,例如: 对于UPDATE语 ...
- 曲演杂坛--蛋疼的ROW_NUMBER函数
使用ROW_NUMBER来分页几乎是家喻户晓的东东了,而且这东西简单易用,简直就是程序员居家必备之杀器,然而ROW_NUMBER也不是一招吃遍天下鲜的无敌BUG般存在,最近就遇到几个小问题,拿出来供大 ...
- 曲演杂坛--特殊字符/生僻字与varchar
对于中文版的SQL SERVER,默认安装后使用的默认排序规则为Chinese_PRC_CI_AS,在此排序规则下,使用varchar类型来可以“正常存取”存放中文字符以及一些东南亚国家的字符,同时v ...
- 曲演杂坛--使用CTE时踩的小坑:No Join Predicate
在一次系统优化中,意外发现一个比较“坑”的SQL,拿出来供大家分享. 生成演示数据: --====================================== --检查测试表是否存在 IF(O ...
- 曲演杂坛--使用TRY CATCH应该注意的一个小细节
群里一个朋友遇到一个TRY CATCH的小问题,测试后发现是自己从来没有考虑的情况,写篇blog加深下印象 --============================================ ...
- 曲演杂坛--SQLCMD下执行命令失败但没有任何错误提示的坑
今天使用SQLCMD导入到SQL SERVER数据库中,看着数据文件都成功执行,但是意外发现有一个文件数据没有成功导入,但执行不报错,很容易导致问题被忽略. 使用存在问题的文件做下测试,从界面上看几行 ...
随机推荐
- nginx环境下配置nagiosQL-关于nagiosql配置文件
接上文:nginx环境下配置nagios-关于nginx.conf nagiosql文件应该处于conf/domain/目录下 nagiosql配置如下: ; gzi ...
- WCF学习第一天
WCF 设计目标 : 1:生产效率 : 统一了现有的各种分布式技术 基于属性(Attribute)的开发 ...
- Node中的http模块
通过Node模块,我们可以实现客户端和服务器端.这篇文章主要研究如何利用http和一些相关模块构建客户端和服务器端代码.读完本文,将能够实现client向server发送数据,而server将数据原样 ...
- 开发板通过UART向主机发送数据
/********************************* 代码功能:开发板通过UART向主机发送数据 使用函数: Serial.begin(数据传输的波特率); Serial.printl ...
- texstudio on ubuntu 12.04
从官网下载针对12.04的版本的texstudio: http://texstudio.sourceforge.net/ 安装deb包:sudo dpkg -i texstudio_xx.deb 运行 ...
- R--相关分布函数、统计函数的使用
分布函数家族: *func()r : 随机分布函数d : 概率密度函数p : 累积分布函数q : 分位数函数 func()表示具体的名称如下表: 例子 #r : 随机分布函数 #d : 概率密度函数 ...
- 对CLR基本原理概念&垃圾回收机制的简单理解
前言,之前有说过C语言的函数&变量的一些基本概念,说得可能不是很好,先也把C#的.里相关的也说下,已成一统. 而说函数变量,其实主要就是GC,而GC又是CLR的主要内容,故就有了此文. CLR ...
- C#中不同的线程对控件的更改
.net 不允许跨线程个性其它线程创建的控件. 要想实现这个功能就需要用 InvokeRequired 检查是不是由该线程创建的控件,如果是直接操作,如果不是则 用Invoke 添加一个委托再加上参数 ...
- wxPython--Python GUI编程参考链接
原文链接http://www.cnblogs.com/coderzh/archive/2008/11/23/1339310.html
- c#控制IE浏览器自动点击等事件WebBrowser,mshtml.IHTMLDocument2 .
// c#控制IE浏览器自动点击等事件WebBrowser,mshtml.IHTMLDocument2 分类: c# 2013-02-06 15:18 3008人阅读 评论(0) 收藏 举报 可以实现 ...