你的位置:首页 > 软件开发 > 数据库 > Key lock 的秘密

Key lock 的秘密

发布时间:2015-08-26 16:00:11
研究死锁,或者观察sp_lock,有时候最恼人的莫过于你看到下面研究成果的key lock,但是却不知道究竟是哪个page 哪个row被lock住了:Exec sp_lock: 就说上面的key (9dd27be994c0) 吧,能不能知道这个key,究竟是对应于那个t ...

Key lock 的秘密

研究死锁,或者观察sp_lock,有时候最恼人的莫过于你看到下面研究成果的key lock,但是却不知道究竟是哪个page 哪个row被lock住了:

Exec sp_lock:

Key lock 的秘密SELECT   %%lockres%% 'key', test.*  FROM  test with(index=2)

结果如下:

Key lock 的秘密

你可以看到,对应sp_lock 的key的hash为9dd27be994c0的行,就是c1=2的那行。简单点你甚至可以使用下面 的语句直接得到某个key hash值的行:

SELECT   %%lockres%% 'key', test.*  FROM  test with(index(idx1)) where %%lockres%% ='(9dd27be994c0)'

 Key lock 的秘密

 

再进一步,能否得到该行对应的page和fileid呢?这个就需要使用另一个undocumented的宏%%physloc%%了:

 

select %%physloc%%,test.*  from test with(index(idx1))

 Key lock 的秘密

上面的返回值是一个十六进制的值,表示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         

原标题:Key lock 的秘密

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录