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

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

一:到底都有哪些锁

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

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

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

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

相关文章

算法基础

目录枚举例题应用:模拟技巧递归$分治递归分治算法贪心常见题型与动态规划的区别例题:应用排序选择排序冒泡排序插入排序计数排序基数排序二分最大值最小化STL 的二分查找三分法最大化平均值(01分数规划)枚举 枚举(英语…

ABP框架 v2.9发布!

ABP框架和ABP商业版2.9已经发布,这是3.0之前的最后一个版本! 这篇文章将涵盖本次发布中的新增内容.ABP框架2.9有哪些新增内容?你可以中GitHub的发行说明中看到所有的变更.这篇文章将只包括重要特征/变更.预编译Razor Pages在之前的版本, 预构建的页面(应用模块)和视…

[JavaWeb-CSS]CSS概述

CSS:页面美化和布局控制 1. 概念: Cascading Style Sheets 层叠样式表* 层叠:多个样式可以作用在同一个html的元素上,同时生效2. 好处:1. 功能强大2. 将内容展示和样式控制分离* 降低耦合度。解耦* 让分工协作更容易*…

2021—ICPC省赛冲刺

OI-wiki 知识点汇总 算法基础 数论 动态规划专题 数据结构专题 数据结构详细 搜索相关 字符串相关 今天看见了别人的整理模板的博客,膜拜,orz,先放上来回头慢慢学习%%%%% 啥都有 超全模板题 板板板 逐步完善中。。。。

最终选型 Blazor.Server:又快又稳!

书接上文,昨天我们快速的走了一遍wasm的开发流程(我的『MVP.Blazor』快速创建与部署),总体来说还是很不错的,无论是从技术上,还是从开发上,重点是用C#来开启前端时代,可以开发SPA单页…

[JavaWeb-HTML]HTML标签(大部分常用标签介绍)

标签学习&#xff1a; 1. 文件标签&#xff1a;构成html最基本的标签* html:html文档的根标签* head&#xff1a;头标签。用于指定html文档的一些属性。引入外部的资源* title&#xff1a;标题标签。* body&#xff1a;体标签* <!DOCTYPE html>&#xff1a;html5中定义该…

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

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

后悔贪心+P2949 [USACO09OPEN]Work Scheduling G

题意&#xff1a; 给你N个任务&#xff0c;每个任务 iii 都有截止日期DiD_{i}Di​和报酬PiP_{i}Pi​&#xff0c;每完成一个工作需要耗费1的单位时间,你需要使所得报酬最大并输出。 题目描述 Farmer John has so very many jobs to do! In order to run the farm efficientl…

[JavaWeb-HTML]HTML标签_表单标签

HTML标签&#xff1a;表单标签 * 表单&#xff1a;* 概念&#xff1a;用于采集用户输入的数据的。用于和服务器进行交互。* form&#xff1a;用于定义表单的。可以定义一个范围&#xff0c;范围代表采集用户数据的范围* 属性&#xff1a;* action&#xff1a;指定提交数据的UR…

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

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

[JavaWeb-CSS]CSS扩展选择器

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

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

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

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

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

[JavaWeb-JavaScript]JavaScript概念与功能

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

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

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

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

文章目录目录插入公式的数学符号Markdown字体颜色、背景markdown表格设置目录 [TOC](目录)[TOC](目录)[TOC](目录) 可以直接生成目录 插入公式的数学符号 可以直接复制用&#xff0c;可以用插入代码&#xff0c;但前后都需加上一个绝对引用符号&#xff08;$) 符号代码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;字符串。 字符串 "…