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

上一篇我只是做了一个堆表让大家初步的认识到锁的痉挛状态,但是在现实世界上并没有这么简单的事情,起码我的表不会没有索引对吧,还有就是我的表一定会有很多的连接过来,10:1的读写,很多码农可能都会遇到类似神乎其神的死锁,卡住,读不出来,插不进入等等神仙的事情导致性能低下,这篇我们一起来探讨下。

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

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


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


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

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

SELECT * FROM Person WHERE ID=6

从上面流程你是否看到,当扫描到89号数据页的slot1槽位的时候卡住了。。。我想你应该知道update正好已经给这条记录加上了X锁。。。如果你够细心,你还会发现,给S锁附加记录的条件是在当引擎发现记录所在的数据页已经附加上了IX锁的情况下,才给该号数据页下的每条记录附加S锁,对吧。。。好了,既然在Profile上面看不到了,我还是有其他办法来判断到底select语句现在处于什么状态。

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


SELECT  l.request_session_id,DB_NAME(l.resource_database_id),OBJECT_NAME(p.object_id),l.resource_description,l.request_type,l.request_status,request_mode
FROM sys.dm_tran_locks AS l
LEFT JOIN sys.partitions AS p
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


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

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

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

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


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

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

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

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

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

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

第三步:找到93号索引数据页的目标key,给这个key加上S锁,有人可能就会问了。。。这个key不就是6嘛,为什么这个key=(61005a25560e),这是因为每行索引记录都有一个散列值,这个值就是根据索引的几个字段散列出来的,好处就是防止你的索引长度过大,导致锁这个记录的时候太耗费锁空间了。。。。如果你还是不太相信的话,我用DBCC给你看一看。

第四步:根据这个key直接跳到存放记录的90号数据页中,万幸的是update的记录刚好不在90号数据页中。。。。就这样躲过一劫了。。。然后select顺利的读取到了该读的记录,最后释放相关的IS锁。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[JavaWeb-CSS]CSS扩展选择器

扩展选择器: 1. 选择所有元素:* 语法: *{}2. 并集选择器:* 选择器1,选择器2{}3.后代选择器祖先元素和后代元素(相对的概念)后代元素:被包含在祖先元素中的元素。祖先元素:包含后代元…

后端程序员转行前端,强烈推荐这6个前端UI框架,第二款小程序UI框架颜值最高!...

昨天有个同事问我有没有可以直接上手的前端UI框架。那今天就给大家推荐6个简单、视觉体验好的前端框架没吃过猪肉,肯定见过猪跑!Jquery Mobiledemo地址:https://demos.jquerymobile.com/1.1.0/教程地址:https://www.codesocang.com/jquerymob…

二分+最大化最小值 River Hopscotch POJ - 3258

题意: 起始有两个石头,位置是000和nnn,在这中间有n个石头,问如何拿走m块石头后,使得他们之间的最小间隔的最大值。 题目: Every year the cows hold an event featuring a peculiar version of hopscotch that invo…

[JavaWeb-JavaScript]JavaScript概念与功能

JavaScript: * 概念: 一门客户端脚本语言* 运行在客户端浏览器中的。每一个浏览器都有JavaScript的解析引擎* 脚本语言:不需要编译,直接就可以被浏览器解析执行了* 功能:* 可以来增强用户和html页面的交互过程&#x…

Kubernetes引发“军备赛”,K8s真是企业生存的关键吗

导语与许多其他国家一样,英国对云基础架构的需求空前增长。随着学校,办公室,商店和饭店的关闭以应对疫情,云驱动的应用程序应运而生,解决挑战并提供安慰。随着各个年龄段人群的屏幕时间激增,数据中心正努力…

Markdown编译器插入公式的数学符号及字体颜色、背景

文章目录目录插入公式的数学符号Markdown字体颜色、背景markdown表格设置目录 [TOC](目录)[TOC](目录)[TOC](目录) 可以直接生成目录 插入公式的数学符号 可以直接复制用,可以用插入代码,但前后都需加上一个绝对引用符号($) 符号代码xax_{…

[JavaWeb-JavaScript]JavaScript与html结合方式

与html结合方式 1. 内部JS&#xff1a;* 定义<script>&#xff0c;标签体内容就是js代码2. 外部JS&#xff1a;* 定义<script>&#xff0c;通过src属性引入外部的js文件* 注意&#xff1a;1. <script>可以定义在html页面的任何地方。但是定义的位置会影响执行…

【新插件发布】AzureAD运维Excel版插件,增删改查快10倍c以上!

在笔者的BI项目开发中&#xff0c;用到了Azure的AzureSQL和AzureAS分析服务&#xff0c;此两大服务&#xff0c;可和AzureAD帐号体系打通。而AzureAD帐号&#xff0c;在其免费功能基础功能上&#xff0c;是免费使用的&#xff0c;随着项目开发上线进入运维阶段&#xff0c;Azur…

数论相关

目录符号整除/同余理论常见符号数论函数常见符号其他常见符号位运算与、或、异或取反左移和右移复合赋值位运算符关于优先级位运算的应用有关 2 的幂的应用取绝对值取两个数的最大/最小值操作一个数的二进制位模拟集合操作快速幂模意义下大整数乘法快速乘高精度快速幂欧拉降幂求…

[JavaWeb-JavaScript]JavaScript注释数据类型

注释 1. 单行注释&#xff1a;//注释内容2. 多行注释&#xff1a;/*注释内容*/数据类型&#xff1a; 1. 原始数据类型(基本数据类型)&#xff1a;1. number&#xff1a;数字。 整数/小数/NaN(not a number 一个不是数字的数字类型)2. string&#xff1a;字符串。 字符串 "…

博客系统知多少:揭秘那些不为人知的学问(二)

点击上方关注“汪宇杰博客”上篇《博客系统知多少&#xff1a;揭秘那些不为人知的学问&#xff08;一&#xff09;》介绍了博客的历史、我的博客故事及博客的受众来源。本篇精彩继续&#xff0c;介绍博客基本功能设计要点。1.“博客”的前世今生2.我的博客故事3.谁是博客的受众…

二分+01分数规划+最大化平均值 Dropping tests POJ - 2976

题意&#xff1a; 给你若n个分数&#xff0c;分子a[i]a[i]a[i],分母b[i]b[i]b[i],使满足公式100⋅∑i1nai∑i1nbi100\cdot\tfrac{\sum_{i1}^{n} a_{i}}{\sum_{i1}^{n} b_{i}}100⋅∑i1n​bi​∑i1n​ai​​&#xff0c;求任意去掉k个分数后&#xff0c;公式结果最大值。 题目…

[JavaWeb-JavaScript]JavaScript变量

变量 * 变量&#xff1a;一小块存储数据的内存空间* Java语言是强类型语言&#xff0c;而JavaScript是弱类型语言。* 强类型&#xff1a;在开辟变量存储空间时&#xff0c;定义了空间将来存储的数据的数据类型。只能存储固定类型的数据* 弱类型&#xff1a;在开辟变量存储空间时…

基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(四)

系列文章使用 abp cli 搭建项目给项目瘦身&#xff0c;让它跑起来完善与美化&#xff0c;Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API&#xff0c;包装返回模型再说Swagger&#xff0c;分组、描述、小绿锁接入GitHub&#xff0c;用JWT保护你的API异常处理和…

莫比乌斯反演/容斥 +2020ICPC 江西省大学生程序设计竞赛 A Simple Math Problem

题目描述 输入描述: 输出描述: 示例1 输入 3 输出 5 分析&#xff1a; 1.这个题其实考的是一个莫比乌斯反演题&#xff0c;但是由于我知识储备不够&#xff0c;没有看出来&#xff0c;题目给的范围可以瞎搞一下&#xff0c;所以下面容斥可以过。 2.转换一下就是一道经典的…

猎鹰与龙飞船基于Linux,采用C++、Chromium与JS开发

最近两天科技界最重大的事件莫过于马斯克的 SpaceX 成功实现了猎鹰 9 号&#xff08;Falcon 9&#xff09;带着龙飞船&#xff08;Crew Dragon&#xff09;成功发射&#xff0c;并使飞船与国际空间站对接&#xff0c;将 NASA 两名宇航员送上了轨道前哨。背后关于 Falcon 9 与 C…

[JavaWeb-JavaScript]JavaScript运算符

运算符 1. 一元运算符&#xff1a;只有一个运算数的运算符&#xff0c;-- &#xff0c; (正号) * --: 自增(自减)* (--) 在前&#xff0c;先自增(自减)&#xff0c;再运算* (--) 在后&#xff0c;先运算&#xff0c;再自增(自减)va* (-)&#xff1a;正负号* 注意&#xff1a;…

java编码给出二维数组List<List<Integer>>matrix,输出每列最小的值

import java.util.LinkedList; import java.util.List;public class Main {public static void main(String[] args){/** a 是一个链表 &#xff0c;链表里面存放的对象是List<Integer>a* temp 是 List<Integer>* */List<List<Integer>> a new Linked…

博客系统知多少:揭秘那些不为人知的学问(四)

点击上方关注“汪宇杰博客” ^_^上篇《博客系统知多少&#xff1a;揭秘那些不为人知的学问&#xff08;三&#xff09;》介绍了博客协议或标准。本篇终章介绍设计博客系统有哪些知识点。1.“博客”的前世今生2.我的博客故事3.谁是博客的受众&#xff1f;4. 博客基本功能设计要点…

[JavaWeb-JavaScript]JavaScript特殊语法

JS特殊语法&#xff1a; 1. 语句以;结尾&#xff0c;如果一行只有一条语句则 ;可以省略 (不建议)2. 变量的定义使用var关键字&#xff0c;也可以不使用* 用&#xff1a; 定义的变量是局部变量* 不用&#xff1a;定义的变量是全局变量(不建议)