作为一个开发人员,锁机制也是我们程序员必须掌握的东西,很久之前在学习锁的时候,都是教科书上怎么说,然后我怎么背,缺少一个工具让我们眼见为实。。。如果这样的话,学习一个东西就很容易忘记。。。因为这些都是你背诵过来的。。。这篇的话我就来分享一个工具来帮助我们学习锁。

一:到底都有哪些锁

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

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号数据页的所有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操作都展示给你看了...我们知道生产环境没有这么简单,但是你有此宝贝,再多动动脑子就????????了。。。

Sql Server之旅——第十二站 对锁的初步认识相关推荐

  1. Sql Server之旅——第十二站 sqltext的参数化处理

    Sql Server之旅--第十二站 sqltext的参数化处理 原文:Sql Server之旅--第十二站 sqltext的参数化处理 说到sql的参数化处理,我也是醉了,因为sql引擎真的是一个无 ...

  2. Sql Server之旅——第十四站 深入的探讨锁机制

    上一篇我只是做了一个堆表让大家初步的认识到锁的痉挛状态,但是在现实世界上并没有这么简单的事情,起码我的表不会没有索引对吧,,,还 有就是我的表一定会有很多的连接过来,10:1的读写,很多码农可能都会遇 ...

  3. Sql Server之旅——第十站 简单说说sqlserver的执行计划

    我们知道sql在底层的执行给我们上层人员开了一个窗口,那就是执行计划,有了执行计划之后,我们就清楚了那些烂sql是怎么执行的,这样 就可以方便的找到sql的缺陷和优化点. 一:执行计划生成过程 说到执 ...

  4. SQL Server索引进阶第十篇:索引的内部结构

    索引设计是数据库设计中比较重要的一个环节,对数据库的性能其中至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就获取到的,很多的技术人员因为不恰当的创建索引,最后使得其效果适得其 ...

  5. Sql Server之旅——第十一站 简单说说sqlserver的执行计划

    原文:Sql Server之旅--第十一站 简单说说sqlserver的执行计划 我们知道sql在底层的执行给我们上层人员开了一个窗口,那就是执行计划,有了执行计划之后,我们就清楚了那些烂sql是怎么 ...

  6. Sql Server之旅——第五站 确实不得不说的DBCC命令

    Sql Server之旅--第五站 确实不得不说的DBCC命令 原文:Sql Server之旅--第五站 确实不得不说的DBCC命令 今天研发中心办年会,晚上就是各自部门聚餐了,我个人喜欢喝干红,在干 ...

  7. 网络云存储技术Windows server 2012 (项目十二 为企业构建虚拟共享服务(工作组模式下的DFS))

    网络云存储技术Windows server 2012 (项目十二 为企业构建虚拟共享服务(工作组模式下的DFS)) 前言 网络存储技术,是以互联网为载体实现数据的传输与存储,它采用面向网络的存储体系结 ...

  8. SQL Server 6.5 如何升级到SQL Server 2000—以前原创(二)

    SQL Server 6.5升级到SQL SERVER 2000 前提条件: 一.SQL Server 6.5 一般安装在 Windows NT 4.0 平台下,要求NT 达到 SP4 SQL Ser ...

  9. 数据库技术与应用(SQL Server)——【SQL Server单表查询(二)】

    单表查询(二) SQL函数: SQL 拥有很多可用于计数和计算的内建函数 SQL函数分类: SQL Aggregate函数和SQL Scalar函数 SQL Aggregate函数(聚合函数或合计函数 ...

最新文章

  1. Ubuntu下安装Stanford CoreNLP
  2. OverFeat:Integrated Recognition, Localization and Detection using Convolutional Networks
  3. 数据库的字段是date java里面能用timestamp吗_数据库中DATETIME,DATE和TIMESTAMP类型 的区别...
  4. 细节:以为字符串不为空
  5. ts文件编译后变量在vscode里报错
  6. 客户端相关知识学习(四)之H5页面如何嵌套到APP中
  7. 澳洲虚拟主机空间_澳洲空间|澳洲虚拟主机|澳洲主机|澳洲虚拟空间-万纵科技 www.xmwzidc.cn...
  8. 中科院遥感与数字地球研究所博士后招聘
  9. (3)机器学习_逻辑模型_决策树
  10. 基于SSM的购物商城系统(含文档)
  11. Windows手动搭建邮箱服务器教程,操作简单易上手
  12. realitycapture 3D建模软件
  13. Mac安装Xcode
  14. 华为荣耀magic2手机系统更新鸿蒙,华为荣耀Magic2怎么禁止系统更新功能_如何关闭和禁用系统更新...
  15. ubuntu 您不是所有者所以您不能更改
  16. 一起来找茬:记一起 clang 开启 -Oz 选项引发的血案
  17. 华为、字节跳动、蔚来、康师傅、法雷奥、AIG等公司高管变动
  18. hiho 1051 : 补提交卡
  19. Java一些七七八八的配置
  20. 商品规格sku算法应用

热门文章

  1. [转] ArcEngine 产生专题图
  2. 服务发现与健康监测框架Consul-DNS转发的应用
  3. 【模拟】【codeforces】599B Spongebob and Joke
  4. Xcode命令行生成Bitcode静态库
  5. IIS6文件权限不对触发了Windows身份认证问题解决方法
  6. 【小安翻唱】凉宫春日的忧郁--冒険でしょでしょ第五届外语歌曲大赛助兴节目~绫魂论坛送aya的生日礼物筹备开始~...
  7. mac共享单个磁盘_如何与您的所有设备共享酒店的单个Wi-Fi连接
  8. ios numlock_从“提示”框:默认情况下启用NumLock,无广告的iOS应用和立体声供电的派对灯...
  9. PHP-FPM 与 Nginx 的通信机制总结
  10. 单词计数WordCountApp.class