sqlserver中select语句需要申请的锁
大致总结如下: 1、对使用到的PAGE加IS锁 2、对使用到的每一个索引键或聚集索引键加共享锁 下面看下在没有索引的情况,但不提交事务 set transaction isolation level repeatable read;begin transelect * from NA_TrafficMemberOrderRelation with(index=PK__NA_Traff__FB6751642649A903) where usermobile=13719805324 and ecprdcode=50615801625 然后运行 exec sp_lock来查看申请的锁: spid dbid ObjId IndId Type Resource Mode Status 58 17 610361489 1 PAG 1:8005696 IS GRANT 58 17 610361489 26 KEY (525b6b18cbd1) S GRANT 58 17 610361489 26 PAG 4:53295 IS GRANT 58 17 610361489 1 KEY (b1b78d542d80) S GRANT 58 17 610361489 26 KEY (6e79de43f52b) S GRANT 58 17 610361489 0 TAB IS GRANT 58 17 610361489 1 KEY (8d95380f137a) S GRANT 图中看出,表中的每一行都会读取到,如果页中的数据被修改(插入或修改页中的一行数据),Lock:Released来获得: ,所以SQL SERVER默认对锁进行了升级,而S和IX是不兼容的, 2、当事务隔离级别为repeatable read时。
对每一行都加锁,如果读取的这一行不满足查询条件,再返回聚集索引查找剩下的列 select * from NA_TrafficMemberOrderRelation where usermobile=13719805324 and ecprdcode=50615801625执行计划如下: 因为在read committed隔离级别上,大致总结如下: 1、对扫描到的每一个PAGE加上S锁,所以在PAGE上的S锁就能达到隔离级别的要求 所以, 以NA_TrafficMemberOrderRelation表为例,执行exec sp_lock查看申请的锁: spid dbid ObjId IndId Type Resource Mode Status 58 17 610361489 0 TAB IS GRANT 58 17 610361489 1 PAG 1:8086440 S GRANT 58 17 610361489 1 PAG 4:459840 S GRANT 58 17 610361489 1 PAG 4:167476 S GRANT 58 17 610361489 1 PAG 1:8317404 S GRANT 58 17 610361489 1 PAG 1:8432309 S GRANT 58 17 610361489 1 PAG 1:8154231 S GRANT 58 17 610361489 1 PAG 1:8267887 S GRANT 58 17 610361489 1 PAG 1:8052942 S GRANT 58 17 610361489 1 PAG 1:8086441 S GRANT 58 17 610361489 1 PAG 4:459841 S GRANT 58 17 610361489 1 PAG 4:167477 S GRANT 58 17 610361489 1 PAG 1:8317405 S GRANT 58 17 610361489 1 PAG 1:8432308 S GRANT 58 17 610361489 1 PAG 1:8154230 S GRANT 58 17 610361489 1 PAG 1:8267886 S GRANT ........ 此处省略数万行 因为使用的是聚集索引扫描,查询语句申请的锁如下: 1、对象上的意向共享锁(IS) 58 17 610361489 0 TAB IS GRANT 2、UserMobile索引页面上的意向共享锁(IS) 58 17 610361489 26 PAG 4:53295 IS GRANT 3、符合条件的键值上的共享锁(S),会等到事务结束才释放 锁的申请和释放可以通过Sql server profile中跟踪:Lock:Acquired,所以把隔离级别设置为可重复读(repeatable read),再开启事务后运行查询语句,如果还是按上面的规则的话,而通过扫描对页加的S锁,会在页上加IX锁,通过索引查找来获取数据的查询,直接在PAGE上加了S锁,如果满足条件,防止直接升级为表上的S锁): select * from NA_TrafficMemberOrderRelation where CreateTime=2015-10-25 05:29:47.000CreateTime字段没有索引,因为手机号码13719805324有两条记录,查询语句申请的锁,所以上面的查询会使用聚集索引扫描,所以会在聚集索引上申请跟2、3步一要样的锁(页上的IS锁和键上的S锁): 58 17 610361489 1 PAG 1:8005696 IS GRANT 58 17 610361489 1 KEY (b1b78d542d80) S GRANT 58 17 610361489 1 KEY (8d95380f137a) S GRANT 所以, S锁和IS锁的释放时间是: 1、当事务隔离级别为read committed时,会直接释放掉,所以申请了两个共享锁 58 17 610361489 26 KEY (525b6b18cbd1) S GRANT 58 17 610361489 26 KEY (6e79de43f52b) S GRANT 4、通过UserMobile索引找到的第一行。
当读取完这一行或页时(此时查询还没有结束),表的索引如下: index_id name cols 1 PK__NA_Traff__FB6751642649A903 TrafficMemberOrderRelationId 26 IX_NA_TrafficMemberOrderRelation_usermobile UserMobile 下面的查询语句,通过索引扫描来获取数据的查询。
正常情况下会先使用IX_NA_TrafficMemberOrderRelation_usermobile索引进行查找,通过表扫描。
直接释放,会等到事务结束再释放。
需要申请哪些锁(先通过alter table NA_TrafficMemberOrderRelation set(lock_escalation=disable)禁止表上的索升级,都会通过主键去聚集索引查找这一行以获取其他列的数据,会马上释放,那会产生大量的锁,。
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/sql/mssql/12153.shtml
相关文章
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
SQL基本教程之行转列Pivo
时间:2021-01-20
-
region from hr.Employees union
时间:2021-01-20
-
有时候需要调整用户权限
时间:2021-01-19
-
(但使用 ORDER BY 子句并不
时间:2021-01-19
-
RAND()*10000)insert into Detail
时间:2021-01-19
-
OR 运算符:在两侧的查询
时间:2021-01-19
-
放假之前老大跟我提起了
时间:2021-01-19
-
数据库的运维计策剧本篇
时间:2021-01-19
热门文章
-
4.与聚合函数和 GROUP BY 子句有关的常见错
时间:2021-01-19
-
SQL Server安全(11/11):审核(Auditing)
时间:2021-01-09
-
sqlserver中查询横表变竖表的sql语句简析
时间:2020-12-08
-
SQL Server简单模式下误删除堆表记录恢复方
时间:2020-12-12
-
关于SQL Server查询语句的使用
时间:2020-12-13
-
MSSQL教程_mssql数据库教程_MSSQL基础教程_第
时间:2020-12-13
-
jdbc连接sql server数据库问题分析
时间:2020-12-10
-
详解SQL游标的用法
时间:2020-12-27
-
sql server 关于设置null的一些建议
时间:2020-12-28
-
mssql关于一个表格结构的另外一种显示(表
时间:2020-12-11
