一:到底都有哪些锁

  学习锁之前,必须要知道锁大概有几种???通常情况下作为码农我们只需知道如下几个锁即可。。。

1.S(Share)锁

  为了方便理解,我们可以直接这么认为,当在select的时候在表,数据页,记录上加上共享锁。

2.X(Exclusive) 锁

  我们在delete数据的时候会在记录上附加X锁,我们知道X锁并不与其他的锁兼容。如果其他的锁与其遭遇,就会处于等待,后续我们再说。

3.U(Update)锁

  顾名思义,我们在Update的时候,在寻找记录的过程中,会逐一的给记录附加U锁,如果找到了目标记录的话,则会将U锁转化为X锁。。。

4.I (Intent)锁

  这个就是所谓的意向锁,一般都是给表和数据页附加的锁,好处就是防止被其他连接修改表结构。

二:天下无敌的SqlServer Profile

  这个工具我想大家都明白,它的监视能力真的是无所不能。。。锁的痉挛状态也全在它的掌握之中。

1. 首先我做一个Person表,Name字段设定4000字节,这样一个数据页可以容纳2条数据,如下图:

DROP TABLE dbo.Person
CREATE TABLE Person(ID INT IDENTITY,NAME CHAR(4000) DEFAULT 'aaaaa')
--插入6条,生成3个数据页
INSERT INTO dbo.Person DEFAULT VALUES
go 6

2. 下面我们看看数据在数据页的分布情况。

3. 然后我们开启Profile,在“事件选择”的Events中选择”Lock:Acquired“和”Lock:Released“ ,然后运行,如下图:

三:使用测试数据

1. 首先我执行一个简单的 SELECT * FROM dbo.Person,看看表/数据页/记录的加锁情况。

从图中可以看到,select执行的大概步骤如下:

第一步:给表(Object)加上IS(意向共享锁)。

第二步:先给1:78号数据页加IS锁,扫描78号数据页,然后释放IS锁。

第三步:同样的道理扫描之后的数据页。

第四步:最后释放表的IS锁,结束整个锁流程。

看完上面的一系列的Lock:Acquired 和 Lock:Released的话,你有没有发现一个问题,不是说好给记录(RID)加上S锁么???这里没加,

是因为引擎进入78号数据页的时候,未发现它存在IU锁或者IX锁。。。所以。。。这个属于锁的组合,后续会说。

2. 接下来用UPDATE dbo.Person SET NAME='bbbbb' WHERE ID=3来看看update的整个过程,乍一看,Profile捕获到的记录还是比较多

  的,下面具体看图:

第一步: 给表(Object)加上IX锁,

第二步: 给数据页(1:78)数据页分配IU锁。然后开始逐一扫描78号数据页的RID记录,进入前就Acquired,退出后就Released,当扫

      描完78号数据页的所有RID后,再释放78号数据页的IU锁,进入下一个数据页。。。

第三步: 我们发现ID=3是在89号数据页上,当引擎扫到该RID之后,我们观察到89号的数据页由IU锁变成了IX锁,并且把1:89:0(slot

      为0的记录)由U锁变成X锁,变成X锁后,就排斥了其他所有的锁,这时候就可以进行Update操作了。

第四步: 后面就继续90号数据页,步骤类似,第二步和第三步。

不知道细心的你有没有发现,在Released Object之前我们才释放1:89:0的X锁,然后释放89号数据页的IX锁,这说明什么???说明这个

Update是贯穿于这个事务的,不像Select操作中,扫完一个数据页就释放一个数据页。

3. 最后再看一个DELETE FROM dbo.Person WHERE ID=3 的操作。

  大概扫了一下上面的图,或许你感觉和Update操作大差不差,会扫描数据页中的每个记录并加上U锁。当在1:89:0槽位中找到了目

标记录后,然后将U锁转化为X锁,具体可以参考Update。

好了,最最单纯的DML操作都展示给你看了...我们知道生产环境没有这么简单,但是你有此宝贝,再多动动脑子就可天下无敌了。。。

转载于:https://www.cnblogs.com/Yongzhouunknown/p/4766973.html

(转)Sql Server 对锁的初步认识相关推荐

  1. SQL SERVER的锁机制(二)——概述(锁的兼容性与可以锁定的资源)

    二.完整的锁兼容性矩阵(见下图) 对上图的是代码说明:见下图. 三.下表列出了数据库引擎可以锁定的资源. 名称 资源 缩写 编码 呈现锁定时,描述该资源的方式 说明 数据行 RID RID 9 文件编 ...

  2. 浅析如何掌握了解SQL Server的锁机制

    各种大型数据库所采用的锁的基本理论是一致的,但在具体实现上各有差别.SQL Server更强调由系统来管理锁.在用户有SQL请求时,系统分析请求,自动在满足锁定条件和系统性能之间为数据库加上适当的锁, ...

  3. SQL Server的锁机制

    锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 ...

  4. SQL Server数据库锁机制及类型

    SQL Server数据库锁机制及类型 [06-05 12:08:14]作者:责任编辑:heyaorong Microsoft SQL Server(以下简称SQL Server)作为一种中小型数据库 ...

  5. Sql Server 中锁的概念

    锁的类型: (1) 共享锁: 共享锁用于所有的只读数据操作. (2) 修改锁: 修改锁在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象 (3) 独占锁: 独占锁是 ...

  6. SQL SERVER的锁机制(三)——概述(锁与事务隔离级别)

    五.锁与事务隔离级别 事务隔离级别简单的说,就是当激活事务时,控制事务内因SQL语句产生的锁定需要保留多入,影响范围多大,以防止多人访问时,在事务内发生数据查询的错误.设置事务隔离级别将影响整条连接. ...

  7. 查看SQL Server被锁的表以及如何解锁

    锁定数据库的一个表的区别 SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除 SELECT * FROM table WITH (TABLOCK ...

  8. SQL SERVER的锁机制(四)——概述(各种事务隔离级别发生的影响)

    六.各种事务隔离级别发生的影响 修改数据的用户会影响同时读取或修改相同数据的其他用户.即这些用户可以并发访问数据.如果数据存储系统没有并发控制,则用户可能会看到以下负面影响: · 未提交的依赖关系(脏 ...

  9. sql server insert 锁表_SQL Server的insert执行的秘密(下) 带外键的insert分析

    上一篇文章介绍了一个最简单INSERT语句的执行计划详细情况,这一篇分析一下带外键表的INSERT的例子. 本文所用的数据表结构如上图所示:其中Blog表上BlogID是自增主键,并在CreateUs ...

最新文章

  1. 设置ECLIPSE 中光标移至代码上自动提示功能
  2. LeetCode My Calendar I
  3. 深度学习(9)TensorFlow基础操作五: Broadcasting
  4. 计算机试题dddd,数据库系统概论试题及答案dddd_Image_Marked.pdf
  5. matlab如何画一个平面,matlab 画平面
  6. jvisualvm.exe远程连接tomcat
  7. Hibernate架构
  8. TextView的一些高级应用(自定义字体、显示多种颜色、添加阴影)
  9. python官网的软件-python
  10. oracle18c如何创建hr用户,Oracle18c创建不带C##的用户
  11. Android adb 命令大全
  12. matlab方程组函数画图,MATLAB学习1 之画图函数
  13. undo歌词中文音译_《U-n-d-e-r–STANDING!》中文歌词及音译
  14. zcu102_14_Zynq在Standalone下使用uGUI
  15. 如何在Microsoft Excel电子表格之间交叉引用单元格
  16. [NOIP2012模拟10.25] 剪草 [贪心+dp]
  17. Druid连接池简介和配置
  18. postinvalidate、postinvalidateOnAnimation和invalidate的区别
  19. 自然语言处理NLP文本分类顶会论文阅读笔记(二)
  20. 制冷与空调作业题库及答案

热门文章

  1. [读书笔记]My Life--Bill Clinton
  2. 学习Python编程的最好的几本书
  3. fastdfs上传文件报错
  4. ubuntu18.10下面安装nodejs和npm和cnpm
  5. 数据结构:线性数据结构(2)-队列(栈,队列,deques, 列表)
  6. 深度学习(三十八)——深度强化学习(1)教程
  7. C语言蒙特卡洛,蒙特卡洛方法
  8. 【转载】linux-查询rpm包相关安装、卸载脚本
  9. Android开发者指南(4) —— Application Fundamentals(二)
  10. php http头设置相关信息