SQL Server死锁资源的查看原创
4人赞赏了该文章
902次浏览
编辑于2020年08月13日 17:30:36
出现死锁,或者阻塞时,针对聚集索引的等待资源为key:dbid:hobtid(keyhashvalue),一般通过上下文,很容易知道对应的表,索引是什么,如果想知道对应表中哪条数据时,就比较麻烦了。
如下图
sql server提供了%%lockresl%%函数,其对应值就是keyhashvalue。为键值的哈希码,通过这个码我们就能知道对应的行记录,注意这个值是同时包括括号的。
如:
以上面的死锁为例,可以获取对应的数据行
如果表没有聚集索引时,SQL SERVER存储数据将会以堆的方式存在,那么此时将显示为page的模式,如:
可以看到,这些数据,都在一个页上。如果插入更多数据,将看到下面的结果:
上面的数据在分配上, 215和998间值是不连续的,这也证明了,sql server下需要有聚集才能保证数据的有序性,才能更好的避免死锁。
如果想看到这些记录在那个数据页上,可以通过%%physloc%%与sys.fn_physlocformatter获取。
附:可以通过下面的脚本,根据数据库名和死锁KEY资源获取数据
declare @databaseName varchar(100) = 'test' --数据库名declare @keyValue varchar(100) = 'KEY: 8:72057845012037632 (37f01f22e733)' --资源declare @lockres varchar(100)declare @hobbitID bigint select @hobbitID = convert(bigint, RTRIM(SUBSTRING(@keyValue, CHARINDEX(':', @keyValue, CHARINDEX(':', @keyValue) + 1) + 1, CHARINDEX('(', @keyValue) - CHARINDEX(':', @keyValue, CHARINDEX(':', @keyValue) + 1) - 1))) select @lockRes = RTRIM(SUBSTRING(@keyValue, CHARINDEX('(', @keyValue) + 1, CHARINDEX(')', @keyValue) - CHARINDEX('(', @keyValue) - 1)) declare @objectName sysnamedeclare @ObjectLookupSQL as nvarchar(max) = 'SELECT @objectName = o.nameFROM ' + quotename(@databaseName) + '.sys.partitions pJOIN ' + quotename(@databaseName) + '.sys.indexes i ON p.index_id = i.index_id AND p.[object_id] = i.[object_id]join ' + quotename(@databaseName)+ '.sys.objects o on o.object_id = i.object_idWHERE hobt_id = ' + convert(nvarchar(50), @hobbitID) + '' exec sp_executesql @ObjectLookupSQL ,N'@objectName sysname OUTPUT' ,@objectName = @objectName output declare @finalResult nvarchar(max) = N'select %%lockres%% hashvalue,'''+@objectName+''' tabname,SYS.fn_PhysLocFormatter(%%PHYSLOC%%) page,*from ' + quotename(@databaseName) + '.dbo.' + @objectName + 'where %%lockres%% = ''(' + @lockRes + ')''' exec sp_executesql @finalResult
赞 4
4人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读