前期准备:

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. Backward Digit Sums(POJ 3187)

    Backward Digit Sums Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5495   Accepted: 31 ...

  2. 利用7z实现一键解压

    目的: 实现双击zip,7z,rar等文件时自动解压,解压完毕后自动打开文件夹. 工具: [本文末尾附有所有工具的下载地址] 7z.exe types 步骤: 新建"7z-自动解压" ...

  3. mysql sql_mode 之 NO_ENGINE_SUBSTITUTION

    知识储备: 1.mysql 有众多的存储引擎,然而只有一个默认的存储引擎,通常来说它是innodb 2.mysql 可以通过sql_mode 来控制mysql 数据库的行为,今天我们要讲的就是no_e ...

  4. 在Raspberry上使用小度WIFI

    小度WIFI价格便宜量又足,我一真用它!做个广告先! 它使用联发科MT7601的芯片,质量不错,就是Raspberry下不能直接支持. 首先下载驱动 http://www.mediatek.com/_ ...

  5. Java 正则提取数字串

    例如:有一个字符串:"数量最低2000份",将其中的2000数字提取出来. String arg0 = "数量最低2000份"; Pattern p = Pat ...

  6. HTML5 canvas translate() 方法

    HTML5 canvas translate() 方法 translate() 方法重新映射画布上的 (0,0) 位置.

  7. 04747_Java语言程序设计(一)_第1章_Java语言基础

    二进制0b开头 八进制0开头 十六进制0x开头 package com.jacky; public class Aserver { public static void main(String arg ...

  8. JVM工作原理和特点(一些二逼的逼神面试官会问的问题)

    作为一种阅读的方式了解下jvm的工作原理 ps:(一些二逼的逼神面试官会问的问题) JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完毕,通过以下4步来完毕JVM环境. ...

  9. Qemu之Network Device全虚拟方案三: I/O虚拟化

    前面两文主要对前端网络流的数据路径和虚拟网卡的创建进行了说明,这些能够看做是Guest OS网络数据包收发的准备工作,那么网络数据包是怎样在Guest OS中进进出出的呢,本文就是重点讲述Guest ...

  10. ubuntu 下安装伪分布式 hadoop

    安装准备: (1)hadoop安装包:hadoop-1.2.1.tar.gz (2)jdk安装包:jdk-7u60-linux-i586.gz (3)要是须要eclipse开发的话 还须要eclips ...