博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
堆表和%%lockres%%函数
阅读量:5922 次
发布时间:2019-06-19

本文共 758 字,大约阅读时间需要 2 分钟。

在今天的文章里,我想向你展示下SQL Server里一个未公开的函数,还有你如何用那个函数来找出在哪页记录被存储。

%%lockres%%

今天我想向你展示的未公开函数叫做%%lockres%%,它与SQL Server的锁实现有关。我们都知道,SQL Server实现锁层级并在记录层,页层,表层请求锁。当在记录层锁被请求,SQL Server不在记录本身放置锁——SQL Server生成一个哈希值(hash value),这个结果哈希值最后被锁。为了计算这个哈希值,SQL Server使用未公开的%%lockres%%函数——你也可以自己调用。

当你在聚集表(有聚集索引定义的表)上调用这个函数,%%lockres%%返回你聚集键列的哈希值。

1 SELECT %%lockres%%, * FROM Person.Person

通过%%lockres%%的返回值几乎没有意思,因为它只是个哈希值。但它可以是很方便的,因为在sys.dm_tran_locks DMV里,你会知道resource_description列的哈希值。因为很容易找出在那条记录上锁被请求。

当你想在堆表上请求一个行层的锁,没有键值可以生成哈希值。在这个情况下,SQL Server在RID值上放置锁——即所谓的行标识值(Row Identifier Value)。这个值8 bytes长有如下格式:文件号:页号:槽号(FileID:PageID:Slot)。当你在堆表上调用%%lockres%%时,SQL Server会返回你这个RID值。

1 SELECT %%lockres%%, * FROM DatabaseLog

因此很容易在堆表上找到在哪个文件,哪个页,哪个槽号记录被存储——很简单,是不是?

感谢关注!

参考文章:

转载地址:http://nuivx.baihongyu.com/

你可能感兴趣的文章
吾日三省吾身
查看>>
这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)
查看>>
使用jmeter进行批量数据创建
查看>>
Java集合类——Set、List、Map、Queue接口
查看>>
数据结构:单链表就地逆置(递归方法)解析
查看>>
Java并发AQS原理分析(二)
查看>>
项目Alpha冲刺 Day4
查看>>
hdu 2018 母牛的故事(递推)
查看>>
ios PageControl and UIScrollView
查看>>
Unity 之 Redux 模式(第二篇)—— Rigidbody 改造,摄像机控制
查看>>
WPF学习(1) – XAML
查看>>
通过<input>中的button实现页面跳转
查看>>
关于springmvc的配置文件
查看>>
zendframework 环境配置
查看>>
高仿MT4行情终端(K线图+操控+简单架构)
查看>>
杀死进程
查看>>
设计模式之中介者模式
查看>>
分布式文件系统HDFS 练习
查看>>
C语言考点
查看>>
即使是做咸鱼,也要做最咸的那一条
查看>>