前期准备:

1、建表

create table T_Btree(X int primary key,Y nvarchar(4000));
            create table T_Heap(X int,Y nvarchar(4000));
            go

2、插入数据

declare @i as int =1;
            while @i<4
            begin
            insert into T_Btree(X,Y) values(@i,REPLICATE(cast(@i as nchar(1)),4000));
            insert into T_Heap(X,Y) values(@i,REPLICATE(cast(@i as nchar),4000));
            set @i = @i +1;
            end
            go

内容输出:

表格1、

select 'T_Btree'as table_name,X,Y from T_Btree;
                               go

表格2、

select 'T_Heap' as table_name ,X,Y from T_Heap;

go

连接的隔离级别设置为:

repeatable read。

set transaction isolation level repeatable read;

设置为这个级别的原因:

repeatable read。

会一直持有锁直到事务完成。

用于查看事务锁的SQL:

select lock.request_type,lock.resource_description,lock.resource_associated_entity_id,lock.request_mode,lock.request_status
                             from sys.dm_tran_locks as lock;
                             go

-------------------------------------------------------------------------------------------------------------------------------------------------------------

1、

对于  select:

A、聚集索引的情况:

begin transaction;

select 'T_Btree' as table_name ,X,Y from T_Btree;

go

锁申请情况:

锁申请情况分析:

1、database             S:是为了防止在读取数据期间database被别的事务删除。

2、page                  IS: 是为了防止在读取数据期间page被别的事务拆分。

3、key                     S:是为了防止在读取数据期间key(index)被别的事务删除。

4、object                IS:是为了防止在读取数据期间table定义被别的事务修改。

B、非聚集索引的情况:

begin transaction;

select 'T_Heap'as table_name,X,Y from T_Heap

with (index(ix_nuc_for_THeap_X));---这里是为了使用索引ix_nuc_for_THeap_X、这样就可以看使用它会加一些什么锁。
                                               go

索引使用情况:

1、database             S:是为了防止在读取数据期间database被别的事务删除。

2、page                  IS: 是为了防止在读取数据期间page被别的事务拆分。

3、key                     S: 是为了防止在读取数据期间key(index)被别的事务删除。

4、object                IS: 是为了防止在读取数据期间table定义被别的事务修改。

5、RID                    S:是为了防止在读取数据期间RID被别的事务删除。

2、

对于 update

SQL server 先可把目标数据找到、然后在做修改。打目标数据要加 S 、然后加 U 、 最后升级到 X;

A聚集索引的情况:

begin transaction
                              update T_Btree
                              set Y = 'AAA';
                              go

1、Key                       X :索引的叶子结点就是数据、要修改数据所以要加X锁。

B非聚集索引的情况:

begin transaction
                              update T_Heap
                              set Y = 'AAA';
                              go

1、RID                             X :修改后行号马上就变了、所以要加  X 锁。

2、key                             U :索引就要更新了   U  锁。

3、

delete:

A聚集索引的情况:

B聚集索引的情况:

4、

insert、

A聚集索引的情况:

begin tran;
                     insert into T_Btree(X,Y) values(4,'44444');
                     go

B聚集索引的情况:

begin tran;
                     insert into T_Heap(X,Y) values(4,'44444');
                     go

-------------------------------------------------------------------------------------------------------------------------------------------------------

总结:

select

1、 查询运行中每一条读到的记录或键值加 S 锁,如果记录不用返回就马上释放锁,如果用就根据隔离级别而定。

2、对于每一个索引都会在上面的键值加 S 锁

3、对于每个读过的页面,都加 I(意向) 锁。

4、查询要扫描的页记录越多、锁的数目也越多、查询用到的索引越多,锁的数目也越多。

所以、

1、尽量减小记录集

2、尽量使用 index scan 避免全表扫描

3、尽量设计好index ,力求一个索引就可以完成一个查询任务

upate

1、对于每个索引都会加  U 锁

2、只对要修改的记录和键加 X 锁

3、与目标列相关的索引越多,锁的数目也会越多。

4、扫描过的数据页面越多、意向锁也就越多,在扫描的过程中,对所有扫描到的记录加锁,哪怕上面没有修改。

所以、

1、尽量减小记录集

2、尽量减少无用的索引

3、尽量使用 index scan 避免全表扫描

delete

1、第一步先要找到要删除的数据、第二步删除目标数据。数据有好的索引第一步申请的锁就会少一些。

2、 delete不只是要删除数据本身,还要删除索引键,所以一张表上的索引越多,删除时要加的锁就越多,

就越容易阻塞。

所以、

只有那些有必要的索引我们才创建。

SQL Server 的各种查询和要申请的锁的更多相关文章

  1. 【转】SQL Server T-SQL高级查询

    SQL Server T-SQL高级查询 高级查询在数据库中用得是最频繁的,也是应用最广泛的. Ø 基本常用查询 --select select * from student; //查询student ...

  2. SQL SERVER中XML查询:FOR XML指定PATH

    SQL SERVER中XML查询:FOR XML指定PATH 前言 在SQL SERVER中,XML查询能够指定RAW,AUTO,EXPLICIT,PATH.本文用一些实例介绍SQL SERVER中指 ...

  3. Sql Server 存储过程中查询数据无法使用 Union(All)

    原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...

  4. SQL Server数据库————连接查询和分组查询

    SQL Server数据库————连接查询和分组查询 分组查询 select 列from  <表名> where  …… group by  列 注意:跟order  by一样group ...

  5. (4.21)sql server中复制查询结果集

    在查询结果窗口中复制列标题似乎是一项简单的任务,但对于业余爱好者来说,这可能是一场噩梦. 没有可见的指令/链接/按钮,其中一个可以使用列标题单击和复制所选数据.让我们看看如何在SQL Server M ...

  6. SQL Server跨服务器查询的实现方法,OpenDataSource

    SQL Server跨服务器查询的方法我们经常需要用到,下面就为您介绍两种SQL Server跨服务器查询的方法,如果您感兴趣的话,不妨一看. SQL Server跨服务器查询方法一:用OPENDAT ...

  7. SQL Server多条件查询的实现

    SQL Server多条件查询的实现 SQL Server多条件查询我们经常会用到,下面就教您如何使用存储过程实现SQL Server多条件查询,希望对您学习SQL Server多条件查询方面有所帮助 ...

  8. sql server block如何查询并kill

    本帖提供两种做法,可避免在 SQL Server 事务锁定时产生的不正常或长时间阻塞,让用户和程序也无限期等待,甚至引起 connection pooling 连接数超过容量. 所谓的「阻塞」,是指当 ...

  9. SQL Server查询优化方法(查询速度慢的原因很多,常见如下几种) .

    今天看到一位博友的文章,觉得不错,转载一下,希望对大家有帮助,更多文章,请访问:http://blog.haoitsoft.com 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺 ...

随机推荐

  1. HTML+CSS学习

    1.彻底弄懂CSS盒子模式(DIV布局快速入门) 2.在CSS中,BOX的Padding属性的数值赋予顺序为padding:10px; 四个内边距都是10px padding:5px 10px; 上下 ...

  2. USB-CSW之旅

    前面总结了usb mass storage的枚举过程,如果所有枚举正常,那么会进入bulkonly协议定义的数据交流,在这个数据包里面还包含了SCSI的协议. Bulkonly协议usbmassbul ...

  3. Eclipse servlet和jsp编写

    servlet: 在你新建的Application myapp/WEB-INF/classes/test目录下新建HelloWorld.java package test; import java.i ...

  4. 瑞柏匡丞:国内外App市场分析报告

    互联网不可阻挡的向移动互联网转化.对于各种新兴产业来讲,移动APP是当下行业的颠覆者,也是未来的王者.国内外app市场的火热程度都已经远远超出了人们的预想,然而国内外市场的区别还是相当明显的. 首先, ...

  5. 剑指offer-面试题23.从上往下打印二叉树

    题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印.例如输入图4.5中 的二叉树,则依次打印出8.6.10.5.7.9.11二叉树结点的定义如下: struct BinaryTr ...

  6. Linux系统下定时上传文件至FTP服务器脚本

    环境:Red Hat Enterprise Linux Server release 6.4 需求:需要将Oracle数据库的定时备份上传至FTP服务器 1.干货,用户名:oracle,数据库名称:X ...

  7. jQuery 局部div刷新和全局刷新方法

    div的局部刷新 $(".dl").load(location.href+".dl");  全页面的刷新方法 window.location.reload( ) ...

  8. JSP中的include的两种用法

    1.两种用法 <%@ include file=” ”%> <jsp:include page=” ” flush=”true”/> 2.用法区别 (1)执行时间上区别 < ...

  9. telnet查看memcached运行参数说明

    在Linux/Windows系统中启动memcached的命令请查看http://weilingfeng98.iteye.com/admin/blogs/1741179 启动完memcached服务器 ...

  10. spring boot1.3.0版本及以上版本profile指定参数无法被打入

    现象:小于1.3.0版本如1.2.6的spring boot, 当指定profile进行参数打入的时候,发现没有问题,但是比如改用1.3.0,1.3.1及其以上版本的时候,发现参数打不进去,经过比对s ...