研究死锁,或者观察sp_lock,有时候最恼人的莫过于你看到下面研究成果的key lock,但是却不知道究竟是哪个page 哪个row被lock住了:Exec sp_lock: 就说上面的key (9dd27be994c0) 吧,能不能知道这个key,究竟是对应于那个t ...
研究死锁,或者观察sp_lock,有时候最恼人的莫过于你看到下面研究成果的key lock,但是却不知道究竟是哪个page 哪个row被lock住了:
Exec sp_lock:
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
原标题:Key lock 的秘密
关键词:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。