Key lock 的秘密
研究死锁,或者观察sp_lock,有时候最恼人的莫过于你看到下面研究成果的key lock,但是却不知道究竟是哪个page 哪个row被lock住了:
Exec sp_lock:
就说上面的key (9dd27be994c0) 吧,能不能知道这个key,究竟是对应于那个table,那个data page,甚至哪一行(row)呢?
可以的。且听我慢慢说来。
先说这一行:
52 20 978102525 2 KEY (9dd27be994c0) X GRANT
其中20就是dbid了,indid 2表示是nonclustered index,而978102525就是objectid了。这个比较好懂。你可以使用Select object_name(978102525)来得到表的名字:
而Key (9dd27be994c0)其实是键值的哈希(hash)值。Hash出来的值,你无法逆向得到它的键值。但是幸运的是,你可以使用微软的undocumented的宏,%%lockres%%,来对表的所有键进行一次同样的hash运算,然后你就可以从hash的结果集里面找到你想要的键值啦。首先,需要知道index为2的是那个index:
select name,index_id,type_desc from sys.indexes where object_id=object_id('test')
name
index_id type_desc
--------------- ----------- ---------------------
cidx1 1 CLUSTERED
idx1 2 NONCLUSTERED
然后就可以使用%%lockres%%了:
SELECT %%lockres%% 'key', test.* FROM test with(index(idx1))
或者:
SELECT %%lockres%% 'key', test.* FROM test with(index=2)
结果如下:
你可以看到,对应sp_lock 的key的hash为9dd27be994c0的行,就是c1=2的那行。简单点你甚至可以使用下面 的语句直接得到某个key hash值的行:
SELECT %%lockres%% 'key', test.* FROM test with(index(idx1)) where %%lockres%% ='(9dd27be994c0)'
再进一步,能否得到该行对应的page和fileid呢?这个就需要使用另一个undocumented的宏.%%physloc%%了:
select %%physloc%%,test.* from test with(index(idx1))
上面的返回值是一个十六进制的值,表示page,file,和slot id。可以使用sys.fn_physlocformatter函数将它转换成一个可读的(file:page:slot)格式的值:
select %%physloc%%,sys.fn_physlocformatter(%%physloc%%) 'physical location',test.* from test with(index(idx1))
结果如下:
对应第二行数据的,就在37828这个page了。这个时候,你可以使用DBCC PAGE来打印出它的内容,探究slot为2 的那行:
dbcc traceon(3604)
dbcc page(20,1,37828,1)
结果:
PAGE: (1:37828)
BUFFER:
BUF @0x00000000803BB400
bpage = 0x000000002CAA6000
bhash = 0x0000000000000000
bpageno = (1:37828)
bdbid = 20
breferences = 0
bcputicks = 0
bsampleCount = 0
bUse1 = 42097 bstat = 0x10b
blog = 0x5ab21c9a
bnext = 0x0000000000000000
PAGE HEADER:
Page @0x000000002CAA6000
m_pageId = (1:37828)
m_headerVersion = 1
m_type = 2
m_typeFlagBits = 0x0 m_level = 0 m_flagBits = 0x0
m_objId (AllocUnitId.idObj) = 194
m_indexId (AllocUnitId.idInd) = 256
Metadata: AllocUnitId = 72057594050641920
Metadata: PartitionId = 72057594046251008 Metadata: IndexId = 2
Metadata: ObjectId = 978102525
m_prevPage = (0:0)
m_nextPage = (0:0)
pminlen = 5
m_slotCnt = 5
m_freeCnt = 7997
m_freeData = 217 m_reservedCnt = 0 m_lsn = (17704:185:18)
m_xactReserved = 0
m_xdesId = (0:20808688)
m_ghostRecCnt = 0
m_tornBits = -1577081955
DB Frag ID = 1
Allocation Status
GAM (1:2) = ALLOCATED
SGAM (1:3) = ALLOCATED
PFS (1:32352) = 0x60 MIXED_EXT ALLOCATED 0_PCT_FULL DIFF (1:6) = CHANGED
ML (1:7) = NOT MIN_LOGGED
DATA:
Slot 0, Offset 0x60, Length 16, DumpStyle BYTE
Record Type = INDEX_RECORD
Record Attributes = NULL_BITMAP
VARIABLE_COLUMNS
Record Size = 16
Memory Dump @0x000000005166A060
0000000000000000: 36010000
00030000 01001000 61626364
6...........abcd
Slot 1, Offset 0x70, Length 22, DumpStyle BYTE
Record Type = INDEX_RECORD
Record Attributes = NULL_BITMAP
VARIABLE_COLUMNS
Record Size = 22
Memory Dump @0x000000005166A070
0000000000000000: 36010000
00030000 02001200 16006162 63640100
6.............abcd..
0000000000000014: 0000
..
Slot 2, Offset 0xc9, Length 16, DumpStyle BYTE
Record Type = INDEX_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS
Record Size = 16
Memory Dump @0x000000005166A0C9
0000000000000000: 36020000
00030000 01001000 31323334
6...........1234
Slot 3, Offset 0x96, Length 18, DumpStyle BYTE
Record Type = INDEX_RECORD
Record Attributes = NULL_BITMAP
VARIABLE_COLUMNS
Record Size = 18
Memory Dump @0x000000005166A096
0000000000000000: 36030000
00030000 01001200 65656566 6666
6...........eeefff
Slot 4, Offset 0xa8, Length 17, DumpStyle BYTE
Record Type = INDEX_RECORD
Record Attributes = NULL_BITMAP
VARIABLE_COLUMNS
Record Size = 17
Memory Dump @0x000000005166A0A8
0000000000000000: 36040000
00030000 01001100 38397070 70
6...........89ppp
OFFSET TABLE:
Row - Offset
4 (0x4) - 168 (0xa8)
3 (0x3) - 150 (0x96)
2 (0x2) - 201 (0xc9)
1 (0x1) - 112 (0x70)
0 (0x0) - 96 (0x60)
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
注意,这个行就是index record,和indid=2完全吻合。
参考:http://blogs.msdn.com/b/apgcdsd/archive/2014/08/20/key-lock.aspx
Key lock 的秘密的更多相关文章
- 关于InnoDB的Next-Key lock
最近一段时间在准备新员工培训的材料,本来打算介绍介绍概念就OK的,但是既然写了事务的章节,就特别想介绍一下锁,介绍了锁,就忍不住想介绍一下Next-Key Lock. 大家知道,标准的事务隔离级别有R ...
- How to make remote key fob for 2002 BMW 3 series
Here share with you on how to make remote key fob for 2002 BMW 3 series: Method 1: 1. Working within ...
- C# 多线程(lock,Monitor,Mutex,同步事件和等待句柄)
本篇从 Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler 的类关系图开始,希望通过本篇的介绍能对常见的线程同步方法有一个整体的认识,而 ...
- [MySQL] gap lock/next-key lock浅析
当InnoDB在判断行锁是否冲突的时候, 除了最基本的IS/IX/S/X锁的冲突判断意外, InnoDB还将锁细分为如下几种子类型: record lock (RK) 记录锁, 仅仅锁住索引记录的一行 ...
- gap lock/next-key lock浅析 Basic-Paxos协议日志同步应用
http://www.cnblogs.com/renolei/p/4673842.html 当InnoDB在判断行锁是否冲突的时候, 除了最基本的IS/IX/S/X锁的冲突判断意外, InnoDB还将 ...
- gap lock/next-key lock浅析Basic-Paxos协议日志同步应用
http://www.cnblogs.com/renolei/p/4673842.html 当InnoDB在判断行锁是否冲突的时候, 除了最基本的IS/IX/S/X锁的冲突判断意外, InnoDB还将 ...
- 1.Redis Lock
使用场景 同步锁,让业务方法在锁设定的时间内是同步执行的 redisService.setIfAbsent redisService.expire @PostMapping("/update ...
- WPF 依赖属性与依赖对象
在介绍依赖属性之前,我先介绍下属性的历史 属性的历史: 早期C++的类中,只有字段及方法,暴露数据靠的是方法, 但是字段直接暴露会不安全,所以才用方法来暴露,在设置的时候加些约束,在MFC中 ...
- 开源框架是如何使用设计模式的-MyBatis缓存机制之装饰者模式
写在前面 聊一聊MyBatis是如何使用装饰者模式的,顺便回顾下缓存的相关知识,可以看看右侧目录一览内容概述. 装饰者模式 这里就不了它的概念了,总结下就是套娃.利用组合的方式将装饰器组合进来,增强共 ...
随机推荐
- CGRectInset CGRectoffset UIEdgeInsetsInsetRect 这三个函数的使用情况
//CGRectInset 将原来的矩形放大或者缩小,正表示缩小,-表示放大. CGRect rect= CGRectMake(20, 50, 100, 80); CGRect rect1=CGRec ...
- WdatePicker 设置今天起 后30天可选
<link href="{:ADDON_PUBLIC_PATH}/style/My97DatePicker/skin/WdatePicker.css" rel="s ...
- ZOJ3555 Ice Climber(dp)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Ice Climber Time Limit: 2 Seconds Me ...
- SQL Server 2005无法远程连接的解决方法
以前一直连接本地的数据库,连接SQL Server 2005是小菜的... 做项目也是老师搭好了服务器端,打上IP去访问就行...也不用考虑太多. 今天自己在公司搭SQL Server 2005服务器 ...
- Linux 常用命令使用方法大搜刮
Linux 常用命令使用方法大搜刮 1.# 表示权限用户(如:root),$ 表示普通用户 开机提示:Login:输入用户名 password:输入口令 用户是系统注册用户成功登陆后,可以进入 ...
- JavaScript实现鼠标拖拽围绕圆心转动
鼠标拖动时旋转(多个节点以同一点旋转) 鼠标拖动时旋转 音量旋钮 圆盘菜单
- MVC中,加入的一个aspx页面用到AspNetPager控件处理办法
今天项目遇到了如题所示的问题,按照官方的案例介绍做分页,简直要奔溃了, 使用URL重写,但是page总是1,根本不跳, 不使用URL重写,又出现,第一页是 http://aa.com/view_asp ...
- [POJ] 2239 Selecting Courses(二分图最大匹配)
题目地址:http://poj.org/problem?id=2239 Li Ming大学选课,每天12节课,每周7天,每种同样的课可能有多节分布在不同天的不同节.问Li Ming最多可以选多少节课. ...
- poj 2773 利用欧拉函数求互质数
题意:找到与n互质的第 k个数 开始一看n是1e6 敲了个暴力结果tle了,后来发现k达到了 1e8 所以需要用到欧拉函数. 我们设小于n的 ,与n互质的数为 (a1,a2,a3.......a(p ...
- 九度OJ 1437 To Fill or Not to Fill
题目大意:小明从杭州去往某目的地,要经过一些加油站,每个加油站的价格不一样.若能顺利到达,求加油费用最少为多少,否则求出能行驶的最远距离. 思路:贪心算法 1>若下一加油站的价格更便宜,则只需走 ...