前期准备:

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. [TYVJ] P1049 最长不下降子序列

    最长不下降子序列 描述 Description 求最长不下降子序列的长度   输入格式 InputFormat 第一行为n,表示n个数第二行n个数   输出格式 OutputFormat 最长不下降子 ...

  2. VS2010常用的调试方法

    1.一直以来都没用过command window, F5以后可以这样用,直接对一个函数,或者变量做模块测试 以下还有一些常用的技巧: 1 悬停鼠标查看表达式值 调试是很有挑战性的.比如在函数内逐步运行 ...

  3. 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活

    图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) by zhangxinxu from http://www.zhangxinxu.com 本 ...

  4. linux 安装gcc和g++

    linux中安装gcc和g++ 今天在linux的服务器上安装C/C++的编译器gcc和g++,运行了如下两条命令: 1 yum install gcc yum install g++ 然后发现gcc ...

  5. 多线程并发 synchronized对象锁的控制与优化

    本文针对用户取款时多线程并发情境,进行相关多线程控制与优化的描述. 首先建立用户类UserTest.业务操作类SynchronizedTest.数据存取类DataStore,多线程测试类MultiTh ...

  6. LINUX下 Udev详解

    如果你使用Linux比较长时间了,那你就知道,在对待设备文件这块,Linux改变了几次策略.在Linux早期,设备文件仅仅是是一些带有适当的属性集的普通文件,它由mknod命令创建,文件存放在/dev ...

  7. windows下启动/关闭Sybase数据库服务器

    启动.关闭Sybase数据库服务器 一.启动Sybase服务器 在windows下介绍两种方法启动Sybase数据库服务器. 1.通过服务器管理器 依次打开控制面板>管理工具>服务 管理窗 ...

  8. mysql 分库分表的方法

    分表后怎么做全文搜索 1.merge方式分表(不好) 2. 使用 sql union 3 使用Sphinx全文检索引擎 一,先说一下为什么要分表 当一张的数据达到几百万时,你查询一次所花的时间会变多, ...

  9. onvif规范 中文介绍

    什么是ONVIF ? ONVIF规范描述了网络视频的模型.接口.数据类型以及数据交互的模式.并复用了一些现有的标准,如WS系列标准等. ONVIF规范的目标是实现一个网络视频框架协议,使不同厂商所生产 ...

  10. Android studio教程:[4]真机测试

    有了Android studio这么好用的软件,自然要有一部不错的安卓手机,然后在真机上测试自己的程序,那样才能更好的发现程序中存在的问题,毕竟模拟器不是真正的手机嘛. 工具/原料 Android s ...