码迷,mamicode.com
首页 > 数据库 > 详细

SQL Server 锁实验(SELECT加锁探究)

时间:2017-06-21 16:00:35      阅读:322      评论:0      收藏:0      [点我收藏+]

标签:from   font   image   request   范围   select   border   begin   范围查询   

本例中使用begin tranwith (holdlock)提示来观察SQL Server在select语句中的锁。
开启事务是为了保证时间极短的查询也能观察到锁情况,因为holdlock会在事务结束后释放锁。
1. 查询主键索引的select语句
技术分享
其上锁情况为:
技术分享
技术分享
这里我选择了一较为靠前的主键值,结果集有6条,因为是主键索引的范围扫描因此扫描到第7行时停止,所以持有7个KEY锁,此外这些记录都在一个页中(1:3104页),因此最终的情况就是上图所示的7个KEY锁和一个数据页的IS锁。这里每一个KEY锁对应一个主键数据行。
需要注意的是如果范围查询的KEY值过多(约为5000),则会发生锁升级,此时只会在表上加一个S锁,释放掉所有的主键KEY锁和IS表锁。关于锁升级参见官网锁升级相关页面。
 
2. 查询非聚集索引的select语句
技术分享
技术分享
其上锁情况为:
技术分享
技术分享
PatientID是一个非唯一非聚集索引,结果集只有1条,因此索引查找时会多查找一个索引键,所以加两个KEY锁,当然键所在的索引页22872本身也需要一个IS锁,之后书签查找需要在数据页3104上加IS锁以便获取其中数据行,最后再相关的数据行上加S类型的KEY锁。
这里我们再使用dbcc page看一下索引页22872的内容:(这里只截取了前10行)
技术分享
技术分享
可以发现非聚集索引页的书签就是主键聚集索引的KEY值,Oracle索引的书签则全部是RowID。 
 
3.进行全表扫描的select语句
技术分享
技术分享
1)当我直接执行 select * from ris_request时其加锁情况是:
select语句会为表上读到的的每个页依次加锁,读完且获取到下一个页的S锁时释放本页的S锁,表上只有一个IS锁。
技术分享
技术分享
2)当我加了with (holdlock)时: 
开始时语句会在很多page上加S锁,并在表上加IS锁,但是很快就会转化为如下图的情况,锁升级为一个表级S锁,S页锁全释放。
技术分享
 

SQL Server 锁实验(SELECT加锁探究)

标签:from   font   image   request   范围   select   border   begin   范围查询   

原文地址:http://www.cnblogs.com/leohahah/p/7059852.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!