上一篇我只是做了一个堆表让大家初步的认识到锁的痉挛状态,但是在现实世界上并没有这么简单的事情,起码我的表不会没有索引对吧,,,还

有就是我的表一定会有很多的连接过来,10:1的读写,很多码农可能都会遇到类似神乎其神的死锁,卡住,读不出来,插不进入等等神仙的事情导致性

能低下,这篇我们一起来探讨下。

一: 当select遇到性能低下的update会怎么样?

1. 还是使用原始的person表,插入6条数据,由于是4000字节,所以两条数据就是一个数据页,如下图:

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

2. 为了模拟性能低下的Update操作,我们开个显式事务来更新ID=4的记录,并且用profile看一下,如下图:

1 BEGIN TRAN
2 UPDATE dbo.Person SET NAME='bbbbb' WHERE id=4

3. 然后我们开下另一个会话连接,读取ID=6的记录会是怎样????好奇吗????

1 SELECT * FROM Person WHERE ID=6

从上面流程你是否看到,当扫描到89号数据页的slot1槽位的时候卡住了。。。我想你应该知道update正好已经给这条记录加上了X锁。。。如果你

够细心,你还会发现,给S锁附加记录的条件是在当引擎发现记录所在的数据页已经附加上了IX锁的情况下,才给该号数据页下的每条记录附加S锁,

对吧。。。好了,既然在Profile上面看不到了,我还是有其他办法来判断到底select语句现在处于什么状态。

4. 使用sys.dm_tran_locks来看当前各个连接持有锁的状态。

1 SELECT  l.request_session_id,
2         DB_NAME(l.resource_database_id),OBJECT_NAME(p.object_id),
3         l.resource_description,l.request_type,
4         l.request_status,request_mode
5 FROM sys.dm_tran_locks AS l
6 LEFT JOIN sys.partitions AS p
7 ON l.resource_associated_entity_id=p.hobt_id

仔细观察上图可以看到,当前有51和52号会话,51号在1:89:1槽位上使用了X锁并且没有释放,52号此时也进入了1:89:1中,并且想给该

RowID附加S锁,但是你也知道S和X锁是排斥的,所以很无奈的一直保持等待状态。

二:使用索引或许可以帮你逃过一劫

  当你看完上面的讲叙,是不是有点害怕???要是在生产环境下出现了这种情况,那我们是不是死的很惨???那接下来使用索引是不是真

的可以帮我们躲过一劫呢???下面跟我一起看一看。

1. 新建索引index

1 -- 在ID列上建一个index
2 CREATE INDEX idx_person ON dbo.Person(ID)

2. 然后我们看下数据页的分布情况,可以看到下图中78,89,90是表数据页,93号为索引数据页。

1 DBCC TRACEON(2588,3604)
2 DBCC IND(Ctrip,Person,-1)

3. 麻蛋的,继续执行上面的那个慢update

BEGIN TRAN
UPDATE dbo.Person SET NAME='bbbbb' WHERE id=4

4. 激动人心的时刻来了,由于数据太少,所以我这里强制让引擎执行我创建的索引,看看结果怎样?

居然没卡住???现在是不是有一股强烈的好奇心来了,狗狗狗。。。马上开启profile,看看到底都发生了什么???

仔细看完这个图,是不是觉得很有意思呢???具体步骤如下:

第一步:给表(Object)加上IS锁。

第二步:因为要走索引,给93号索引数据页加上IS锁。

第三步:找到93号索引数据页的目标key,给这个key加上S锁,有人可能就会问了。。。这个key不就是6嘛,为什么这个key=(61005a25560e),

    你要是太好奇我可以告诉你,年轻人说话不要太屌,每行索引记录都有一个散列值,这个值就是根据索引的几个字段散列出来的,好处就是

        防止你的索引长度过大,导致锁这个记录的时候太耗费锁空间了。。。。如果你还是不太相信的话,我用DBCC给你看一看。      

第四步:根据这个key直接跳到存放记录的90号数据页中,万幸的是update的记录刚好不在90号数据页中。。。。就这样躲过一劫了。。。然

       后select顺利的读取到了该读的记录,最后释放相关的IS锁。

  如果你看懂了上面所说的几点,我想你对锁已经入门了,如果觉得还是有些糊涂的话,没关系。。。你有了profile利器,,,自己多试验试

验就好,毕竟我也是这样,晚上再发布最后一篇,明天晚上回家。。。这样就可以安心顺利的过大年了。

Sql Server之旅——第十四站 深入的探讨锁机制相关推荐

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

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

  2. Sql Server之旅——第十二站 对锁的初步认识

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

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

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

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

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

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

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

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

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

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

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

  8. 打怪升级之小白的大数据之旅(七十四)<初识Kafka>

    打怪升级之小白的大数据之旅(七十四) 初识Kafka 引言 学完Flume之后,接下来将为大家带来Kafka相关的知识点,在工作中,Kafka和Flume经常会搭配使用,那么Kafka究竟是什么呢?让 ...

  9. SQL Server 2008空间数据应用系列四:基础空间对象与函数应用

    SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 原文:SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 友情提示,您阅读本篇博文的先决条件如下: 1. ...

最新文章

  1. MyEclipse 快捷键1(CTRL)
  2. slf4j 和 log4j的关系及合用Maven配置
  3. 一句话概括4本管理著作
  4. JS实现Ajax异步刷新
  5. Jonathan Bryce说:OpenStack属于全世界,并不属于一个公司,也不会属于一个国家……...
  6. 使用方法_山西硅肥使用方法
  7. Android超级好看的动态登陆界面(附有详细代码)
  8. 服务器机房维护制度,服务器机房的管理制度.doc
  9. 百度坐标转换中文地址(百度地图JavaScript API逆地址解析 )
  10. 嵌入式和单片机的区别在哪?
  11. 数据科学-Matplotlib(直方条形和散点作业)
  12. Bypass open_basedir
  13. 2022-2028全球与中国智能家居产品市场现状及未来发展趋势
  14. 在CentOS7上安装Mysql,无法启动提示错误:Failed to initialize DD Storage Engine
  15. MACD、KDJ、DMA等常用技术指标的python实现
  16. java计算机毕业设计民航售票管理系统源代码+数据库+系统+lw文档
  17. 天梵古法健康知识普及:手阳明大肠经
  18. CSDN学霸课表——把Word的默认背景颜色由白色改为绿色
  19. 天翼云主攻“5G+云+AI”,新生态革命的冲锋
  20. 6-1 求实数和的函数

热门文章

  1. Php 获取xml中的节点值
  2. 异步委托实现多线程winform控件编程
  3. html 表格自动计算,HTML表格中的JavaScript计算
  4. gradle 指定springcloud 版本_SpringCloud微服务架构开发实战:实现服务注册与发现
  5. php linux脚本文件,Unix/Linux中如何直接执行PHP脚本文件?
  6. C语言经典小游戏---猜数字游戏 (包含C语言中如何实现随机数的生成)
  7. 关于TensorFlow报错ModuleNotFoundError: No module named ‘imutils‘
  8. 牛客小白月赛25 补题+题解[A-J]
  9. 思维 ---- 两两匹配问题 2021杭电多校第6场 E - Median
  10. Sigma Function LightOJ - 1336[约数和定理]