通过DBCC Page查看在SQL Server中哪行数据被锁住了?
原文:通过DBCC Page查看在SQL Server中哪行数据被锁住了?
如何查看被锁的是哪行数据?通过dbcc page可以。
要想明白这个问题:
首先,需要模拟阻塞问题,这里直接模拟了阻塞问题的一个比较极端的情况,就是死锁。
然后,需要知道如何监控死锁,否则,就算产生了死锁,你也不一定知道。这里在模拟死锁之前,通过SQL Profiler先来监控死锁问题。
接下来,我们可以通过sys.dm_tran_locks来获取更详细的阻塞信息。
最后,通过dbcc page来解析哪一行数据被锁住了。
下面就按照上面的步骤,一步一步来实现:
1、先监控死锁。
先选择SQL Profiler:
然后,新建跟踪,单击连接:
接下来,选择“事件选择”选项卡,点击“显示所有事件”复选框,在其中点击“Locks”事件,在“Deadlock graph”复选框,这样在发生死锁的时候,就会被监控到,而且以图像的方式显示死锁的信息,易于理解:
2、构造死锁。
先创建一个表
-
--建表
-
if OBJECT_ID('t1') is not null
-
drop table t1
-
go
-
-
create table t1
-
(
-
id int primary key,
-
v varchar(20)
-
)
-
-
-
insert into t1
-
select 1 ,'aa' union all
-
select 2 ,'bb' union all
-
select 3 ,'cc' union all
-
select 4 ,'dd' union all
-
select 5 ,'ee' union all
-
select 6 ,'ff'
开启会话X,在里面输入下面的代码:
-
--执行顺序.1
-
begin tran
-
-
update t1
-
set v = 'xx'
-
where id = 3
-
--执行顺序.1
-
-
-
--执行顺序.3
-
update t1
-
set v = 'yy'
-
where id = 6
-
--执行顺序.3
再次开启会话Y,在里面输入代码:
-
--执行顺序.2
-
begin tran
-
-
update t1
-
set v = 'mm'
-
where id = 6
-
-
--执行顺序.2
-
-
-
--执行顺序.4
-
update t1
-
set v = 'nn'
-
where id = 3
-
-
--执行顺序.4
然后,按照先执行会话X中的执行顺序1,然后执行会话Y中的执行顺序2,执行会话X中的执行顺序3,执行会话Y中的执行顺序4,一步一步执行。
当执行完这4个步骤后,在会话X中,显示了死锁,且会话X的事务被回滚:
同时,能在SQL Profiler中看到监控到的死锁:
从这个图中,我们可以看到详细的死锁信息,打叉的表示被回滚的会话,把鼠标放到椭圆上,会显示导致死锁的,这个会话正在运行的sql语句。
在长方形的框中,可以看到两个会话要获取X锁,左边的会话拥有下面方框中的键锁,右边的会话拥有上面的键锁,而当左边的会话想要获取上面的键锁是,被阻塞住了,而当右边的会话想要获取下面的键锁时,也被阻塞了,于是整个图像中形成了一个循环,也就导致了死锁。
3、获取更详细的阻塞信息。
注意,上面提到的会话X,这里是53,而会话Y是55,这个可以从上面图中,椭圆形中的“服务器进程ID”获得。
通过通过sys.dm_tran_locks,可以获取到更为详细的阻塞信息。
-
select resource_type,
-
resource_database_id, --数据库id
-
resource_description, --资源描述
-
resource_associated_entity_id, --资源关联实体id
-
request_mode, --请求模式
-
request_type, --请求类型
-
request_status,
-
request_session_id, --请求会话id
-
request_owner_type
-
from sys.dm_tran_locks
-
where request_session_id = 55
解析resource_associated_entity_id的值:
-
--1.查询resource_associated_entity_id的意义
-
select *
-
from sys.tables
-
where object_id = 837578022
-
/*
-
这个id是t1表
-
-
name object_id
-
t1 837578022
-
*/
-
-
-
--2.查询resource_associated_entity_id的意义
-
select *
-
from sys.partitions p
-
where p.hobt_id = 72057594041466880
-
/*
-
这个是表t1的一个b树
-
-
partition_id object_id index_id partition_number hobt_id
-
72057594041466880 837578022 1 1 72057594041466880
-
*/
4、通过dbcc page来解析sys.dm_tran_locks中resource_description列的值:
-
resource_type resource_database_id resource_description
-
PAGE 10 1:188
-
KEY 10 (b9b173bbe8d5)
-
KEY 10 (98ec012aa510)
为了能解析resource_description的值,需要建立一个表和一个存储过程,注意在存储过程中引用的1:188,就是上面sys.dm_tran_locks中的结果:
-
--3.这里创建一个表,用来存放dbcc page的结果
-
if exists(select * from sys.tables where name = 'dbcc_page')
-
drop table dbcc_page
-
go
-
create table dbcc_page
-
(
-
ParentObject varchar(500),
-
Object varchar(2000),
-
Field varchar(1000),
-
Value nvarchar(max)
-
)
-
go
-
-
-
--创建一个存储过程
-
if exists(select * from sys.procedures where name = 'proc_dbcc_page')
-
drop procedure proc_dbcc_page
-
go
-
-
create procedure proc_dbcc_page
-
as
-
-
DBCC page(10, --数据库id : 10
-
1, --文件id: 1
-
188, --页id: 188
-
3) with tableresults
-
-
go
-
-
insert into dbcc_page
-
exec proc_dbcc_page
-
go
最后,我们查询一下,(b9b173bbe8d5)和(98ec012aa510),到底是哪一行数据
-
--查询(b9b173bbe8d5)和(98ec012aa510),到底是哪一行数据
-
;with t
-
as
-
(
-
select OBJECT,
-
Field,
-
value,
-
case when charindex('Column',object) > 0
-
then charindex('Column',object)
-
else charindex('Offset',object)
-
end as substring_len
-
from dbcc_page dp
-
where Object like 'Slot%Column%'
-
or
-
Field = 'KeyHashValue'
-
),
-
-
tt
-
as
-
(
-
select object,
-
field,
-
value,
-
cast(substring(object,len('Slot')+1,substring_len-len('Slot')-1) as int) as row
-
from t
-
),
-
-
ttt
-
as
-
(
-
select object,
-
field,
-
value,
-
row, --第几行
-
max(case when field = 'KeyHashValue'
-
then value
-
else ''
-
end) over(partition by row) as KeyHashValue
-
from tt
-
)
-
-
select *
-
from ttt
-
where KeyHashValue in ('(b9b173bbe8d5)', '(98ec012aa510)')
下面的是查询结果:
从上图中,我们能很清楚的看到(b9b173bbe8d5)和(98ec012aa510),就是id为3、6的两行数据,这两行数据最后被会话55锁住了。
通过DBCC Page查看在SQL Server中哪行数据被锁住了?的更多相关文章
- .SQL Server中 image类型数据的比较
原文:.SQL Server中 image类型数据的比较 在SQL Server中如果你对text.ntext或者image数据类型的数据进行比较.将会提示:不能比较或排序 text.ntext 和 ...
- 删除sql server中重复的数据
原文:删除sql server中重复的数据 with list_numbers as( select Name, AuthorOrTime, Url, Price, EstimatePrice, Si ...
- sql Server中临时表与数据表的区别
sql server 中临时表与数据表的区别 1.如何判断临时表和数据表已生成 --如何判断临时表是否已创建--- if exists(select * from tempdb..sysobjects ...
- 转:Sql Server中清空所有数据表中的记录
如果要删除数据表中所有数据只要遍历一下数据库再删除就可以了,清除所有数据我们可以使用搜索出所有表名,构造为一条SQL语句进行清除了,这里我一一给各位同学介绍. 使用sql删除数据库中所有表是不难的 ...
- SQL Server中Table字典数据的查询SQL示例代码
SQL Server中Table字典数据的查询SQL示例代码 前言 在数据库系统原理与设计(第3版)教科书中这样写道: 数据库包含4类数据: 1.用户数据 2.元数据 3.索引 4.应用元数据 其中, ...
- Sql Server中清空所有数据表中的记录
Sql Server中清空所有数据表中的记录 清空所有数据表中的记录: 代码如下:exec sp_msforeachtable @Command1 ='truncate table ?'删除所有数据 ...
- 从TXT文本文档向Sql Server中批量导入数据
下面我们通过以下的简单的SQL语句即可实现数据的批量导入,代码如下: Bulk insert id From 'G:\文档\test.txt' With ( fieldterminator=',', ...
- SQL Server 中 ROWLOCK 行级锁
一.ROWLOCK的使用 1.ROWLOCK行级锁确保,在用户取得被更新的行,到该行进行更新,这段时间内不被其它用户所修改.因而行级锁即可保证数据的一致性,又能提高数据操作的并发性. 2.ROWLOC ...
- Sql Server实现多行数据按分组用逗号分隔成一行数据
例如,要将下面的数据 以GROUP_ID进行分组,一组一行,一组中的多个PRODUCT_ID用逗号分隔,select 出来成如下结果: 在Sql Server中,我目前想到的一种方法是写一个函数,如下 ...
随机推荐
- 3dmax联机分布式渲染方法技巧详解
3dmax联机分布式渲染方法技巧详解 \测试环境:win7系统 3DMAX2009 Vray2.0 .首先要保证你的两台电脑能在局域网里互相访问如图: 其他电脑上也一样都能打开对方的电脑! 步! ...
- 构建Hadoop监控共同体
HDFS监控背后那些事儿,构建Hadoop监控共同体 原创: 应用研发部 京东云 2018-12-19 https://mp.weixin.qq.com/s/kulwDgwu-rYf4SvQ1dOwc ...
- Mac使用brew安装nginx,并解决端口80访问权限问题
1.安装 brew install nginx 2.修改配置文件 sudo vi /usr/local/etc/nginx/nginx.conf 修改默认的8080端口为80 修改日志文件地方 err ...
- Arduino---ESP8266 WIFI模块
一:Arduino安装ESP8266 https://www.arduino.cn/thread-76029-1-1.html(内容截图如下:最简单方法) 选用NodeMCU .0即可 二:简单测试 ...
- web手工项目02-注册功能输入分析,处理,输出方法-测试用例及缺陷编写-首页轮播图和购物车
web手工项目第二天笔记 昨日回顾 搭建测试环境(WAMP,phpStudy,tpshop项目文件) 熟悉项目(四个步骤,三个来源) 项目测试流程(需求评审,测试计划与方案,测试用例设计与评审,测试执 ...
- SpringCloud学习成长之 九 服务链路跟踪
这篇文章主要讲述服务追踪组件zipkin,Spring Cloud Sleuth集成了zipkin组件. 一.简介 Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案, ...
- python基础之线程、进程、协程
线程 线程基础知识 一个应用程序,可以多进程.也可以多线程. 一个python脚本,默认是单进程,单线程的. I/O操作(音频.视频.显卡操作),不占用CPU,所以: 对于I/O密集型操作,不会占用C ...
- PAT 甲级 1060 Are They Equal (25 分)(科学计数法,接连做了2天,考虑要全面,坑点多,真麻烦)
1060 Are They Equal (25 分) If a machine can save only 3 significant digits, the float numbers 1230 ...
- 设置滑动TabBar的显示和隐藏
代码如下: //设置滑动的判定范围 - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint ...
- Java不写文件,LOAD DATA LOCAL INFILE大批量导入数据到MySQL的实现(转)
MySQL使用load data local infile 从文件中导入数据比insert语句要快,MySQL文档上说要快20倍左右.但是这个方法有个缺点,就是导入数据之前,必须要有文件,也就是说从文 ...
