mysql 中的锁

一.锁的介绍

锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,除了传统的计算资源(cpu,ram,i/o)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题。锁冲突也是影响数据库并发访问性能的一个重要因素。

二.mysql锁的分类

三.mysql中锁的介绍

mysql中的锁,按照锁的粒度分可以分为

  全局锁:锁定数据库中的所有表

                 3.1什么是全局锁

                  全局锁是针对整个数据库的锁。(我的理解就是一个数据库锁,锁的就是整个数据库)

                   全局锁里面又分为读锁和写锁。

                    读锁(共享锁):可以多个线程来读取数据,但是不可写入数据。

                    写锁(排他锁):不允许其他线程来读取和写入数据。

                  3.2 应用场景

                        dump表中所有数据的时候可以加入全局锁,保证数据的一致性。

                         利用mvcc机制也同样可以实现数据dump,但是不用加锁

                          

                   3.3 全局锁具体示例

                         开启读锁:flush tables with read lock;

                            开启读锁,其他线程不可以 修改操作,阻塞中或报错,查询可以

 

释放锁后可以修改成功

    

  表级锁:  每次操作锁住整张表。

                 3.1什么是表级锁

                      每次操作锁住整张表,开销小,加锁快,不会出现死锁,锁定的粒度大,发生锁冲突的概率最高,并发低。

                    表级锁里面又分为表共享读锁和表独占写锁。

                    表共享读锁  :{读锁(共享锁)}:可以多个线程来读取数据,但是不可写入数据。

                   表独占写锁   : {写锁(排他锁)}:不允许其他线程来读取和写入数据。

                  3.2 应用场景

                        1.读密集型的场景

                         2.写操作不是很密集的场景

                   3.3 表级锁具体演示

                          1.执行 alter table;

                          2.执行drop table 或者 truncate table;

                          3.lock tables t1 write,t2 read.

                             以上命令给表1加上写锁,给表2 加上读锁。

                              开启读锁的效果:

                              开启写锁

 

              查看 锁的状态:show open tables where in_use > 0;

              总结:

                       在同一个客户端中:

                       开启表的读锁,不可以进行修改,只可以查询

                       开启表的写锁,可以修改,可以查询

                       在不同的客户端中:

                       开启表的读锁,不可以进行修改,只可以查询

                       开启表的写锁,不可以修改,不可以查询 

                        开启表的写锁:下面是在不同的客户端中查询阻塞

                     

                       缺点:并发性能下降。

  行级锁:每次操作锁住对应的行数据。

                 3.1什么是行级锁

                      锁定的是数据的一行,粒度小,能提供更好的并发性,需要更多的资源。

                     行级锁里面又分为共享锁和排他锁。

                    共享锁 :{读锁(共享锁)}:可以多个线程来读取数据,但是不可写入数据。

                    排他锁 :{写锁(排他锁)}:不允许其他线程来读取和写入数据。

                 3.2使用场景

                     1.高并发

                     2.遇到事物的操作                     

                        查看那些是行级锁:select * from performance_schema.data_locks;

                        行级锁, 如果不在事物中执行,语句执行完毕,锁释放

                         

                        在事物中执行,在没有commit之前这个排他锁一直存在

                  案例演示:

                     执行排他锁(写锁):select ... for update  

                     第一个窗口开始事物,设置排他锁

                         第二个窗口可以查询,不可以修改

                         

                       执行共享锁(读锁):select......lock in share mode

                        第一个窗口开启 事物,开启共享锁

                           第二个窗口 可以查询,不可以修改

                      总结:  开启行的共享锁和排他锁不同窗口都可以读,不可以修改。

                     造成的问题:

                         1. 在多个事物当中会发生死锁(事物可以理解为多个线程)。

                         2.锁升级 (锁定多行后,发现还不如锁定整个表)

                         3.不同的事物隔离级别会影响锁的性能和行为,根据具体的场景来调整事物隔离级别。

按照锁的状态范围分类

 共享意向锁

 排他意向锁

意向锁个人理解就是一个“信号标记性能锁”,以前要去一行一行遍历表中的数据,判断是否存在行锁,现在去看一下,信号标记就可以。

概念 :意向锁是表锁,为了协调行锁和表锁的关系,支持多粒度(表锁与行锁)的锁并存。

作用:当有事物(线程)A有行锁时,mysql会自动为该表添加意向锁,事物(线程)b如果想申请整个表的写锁,那么不需要遍历每一行判断是否存在行锁,而直接判断是否存在意向锁,增强性能。

查看那些是行级锁:select * from performance_schema.data_locks;

案例演示:

  1.第一个窗口开启事物,并开启排他锁

          

2.查看当前的锁

查看LOCK_TYPE,LOCK_MODE 第一个是表级的意向排他锁 lX显示为排他锁

X是排他锁 LOCK_TYPE显示为 record 行级别。

3.在另一个窗口中添加写锁是阻塞状态:

总结:

间隙锁(范围锁)

和临界锁类似,是一个范围锁。两个值之间的空隙加锁。

演示示例:

1.查看当前的表结构

2.开启事物设置间隙锁(查询的id一定要不存在)

3.开启一个窗口,看到 id < 7的可以正常插入,id > 7 < 10的数据插入失败

临界锁

什么是临界锁 next-key 可以理解为一种特殊的间隙锁,也可以理解为一种特殊的算法。通过临界锁可以解决幻读的问题。每个数据行上的非唯一索引列上都会存在一把临界锁,当某个事物持有该数据的临界锁时,会锁住一段左开右闭区间的数据。innodb中行级锁是基于索引实现的,临界锁只与非唯一索引列有关,在唯一索引列上不存在临界锁。(把下面的演示做一遍才理解的更深刻)

演示案例

第一个窗口开启事物设置,设置临界锁为2000,表里面已经有1000的数据,

所以区间是1000-2000

第二个窗口在插入大于1000   小于 2000范围的数据是阻塞状态,插入不进去

发现插入小于1000也处于阻塞状态,拉拉了。一定要是 (每个数据行上的非唯一索引列上都会存在一把临界锁)才会有临界锁

mysql锁总结:

mysql中锁的分类可以多事物(线程)操作不可以多事物(线程)操作
数据库锁(全局锁)读锁写锁
表级锁

共享

lock tables t2 read.

排他

lock tables t1 write;

行级锁

共享锁 

select ..... lock in share mode;

排他锁

select..... for update;

                     共享锁 ,读锁 都可以理解为 共享读锁

                     排他锁 ,写锁  都可以理解为 排他写锁

                     间隙锁是innodb引擎为了解决幻读,临界锁也是为了解决幻读。

参考:阿里一面:MySQL锁你了解吗?说一下什么是mysql间隙锁?招架不住啊。。_哔哩哔哩_bilibili

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

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

相关文章

初见 Rollup 的十大常见问题

文章目录 初见 Rollup 的十大常见问题1. 超神奇的 Rollup 英文解释&#xff01;2. 为什么 ESM 要比 CommonJS 要好呢&#xff1f;3. 什么是 tree-shaking ?4. 如何使用 Rollup 处理 CommonJS&#xff1f;5. 为什么 node-resolve 不是一个内置功能&#xff1f;6. 为什么在进行代…

如何警用root用户登录ssh

使用tail指令&#xff0c;可以动态查看日志信息。 &#xff08;tail -f /var/log/secure或messages&#xff09; 使用>符号&#xff0c;可以清空日志内容&#xff0c;不删除文件本身。 禁用root用户为以下步骤&#xff1a; 首先使用useradd创建用户&#xff08;可以修改为其…

STM32HAL-最简单的时间片论法

目录 概述 一、开发环境 二、STM32CubeMx配置 三、编码 四、运行结果 五、总结 概述 本文章使用最简单的写法时间片论法框架,非常适合移植各类型单片机,特别是资源少的芯片上。接下来将在stm32单片机上实现,只需占用1个定时器作为tick即可。(按键框架+时间片论法)…

【数据结构之B树的讲解】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

【乐吾乐2D可视化组态编辑器】开关、阀门、报警状态切换

开关状态 开关的断开与闭合&#xff1a;将电力组件的“开”与“关”2个组件重叠在一起&#xff0c;右键选择“组合为状态”&#xff0c;属性面板中就可以任意切换状态。 视频教程&#xff1a;开关阀门多状态控制 乐吾乐2D可视化组态编辑器地址&#xff1a;https://2d.le5le.co…

【python】python指南(三):使用正则表达式re提取文本中的http链接

一、引言 对于算法工程师来说&#xff0c;语言从来都不是关键&#xff0c;关键是快速学习以及解决问题的能力。大学的时候参加ACM/ICPC一直使用的是C语言&#xff0c;实习的时候做一个算法策略后台用的是php&#xff0c;毕业后做策略算法开发&#xff0c;因为要用spark&#x…

js编程环境配置-vscode

1、安装Node.js 官网下载 选择适合你Windows系统架构&#xff08;32位或64位&#xff09;的安装包。windows系统选择“Windows Installer (.msi)”或“Windows Binary (.exe)”进行下载。 双击下载的.msi或.exe文件进行安装。 在cmd中输入node --version和npm --version&…

2-4 基于matlab的洛伦兹系统分岔图实现

基于matlab的洛伦兹系统分岔图实现。通过2种方法&#xff0c;最大值法&#xff0c;庞加莱截面法进行输出分岔图。可直接运行。 2-4 洛伦兹系统分岔图 最大值法 - 小红书 (xiaohongshu.com)

如何平衡安全访问和办公效率?零信任安全×统一身份才是解决之道

在远程办公、混合办公、跨团队协作日益频繁的今天&#xff0c;企业的业务开展需要支持多种访问接入的需求和场景。如何平衡企业数据的安全访问和办公效率将成为挑战。 在业务的多种接入场景上&#xff0c;企业引入零信任&#xff08;Zero Trust&#xff0c;ZT&#xff09;产品…

ESP-IDF OTA升级过程中遇到的“esp_transport_read returned:-1 and errno:128”问题(4)

接前一篇文章:ESP-IDF OTA升级过程中遇到的“esp_transport_read returned:-1 and errno:128”问题(3) 上一回讲到,笔者准备第二天围绕信号强度展开进一步测试。实际上没等到第二天,笔者在当天下午下班时间(18点)以后就进行了相关测试(不过测试倒并不是完全针对于信号强…

手机是如何实现多个应用程序同时运行的?

想要理解这个问题&#xff0c;我们要先了解一下操作系统以及进程相关的知识&#xff1a; 操作系统的功能有很多&#xff0c; 例如&#xff1a; 进程管理&#xff08;Process Management&#xff09;&#xff1a; 功能&#xff1a;创建和终止进程&#xff0c;进程调度&#xf…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 连续区间和(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 连续区间和(100分) 🌍 评测功能需要订阅专栏后私信联系清隆…

海豚调度异常处理: 使用 arthas 在内存中删除启动失败的工作流

&#x1f4a1; 本系列文章是 DolphinScheduler 由浅入深的教程&#xff0c;涵盖搭建、二开迭代、核心原理解读、运维和管理等一系列内容。适用于想对 DolphinScheduler了解或想要加深理解的读者。祝开卷有益。大数据学习指南 大家好&#xff0c;我是小陶&#xff0c;DolphinSch…

明天二战六级

明天二战六级&#xff0c;各位程序员们&#xff0c;加油

八股文系列Spark

为什么Spark 比 MapReduce 更快 DAG相比hadoop的mapreduce在大多数情况下可以减少磁盘I/O次数 mapreduce通常需要将计算的中间结果写入磁盘&#xff0c;然后还要再读取磁盘&#xff0c;从而导致了频繁的磁盘IO。 spark通常不需要将计算的中间结果写入磁盘&#xff0c;只有shuf…

【C++ | const成员】一文了解类的 const数据成员、const成员函数、const对象、mutable 数据成员

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-06-14 2…

新一代大核卷积反超ViT和ConvNet!同参数量下性能、精度、速度完胜

大核卷积网络是CNN的一种变体&#xff0c;也是深度学习领域的一种重要技术&#xff0c;它使用较大的卷积核来处理图像数据&#xff0c;以提高模型对视觉信息的理解和处理能力。 这种类型的网络能够捕捉到更多的空间信息&#xff0c;因为它的大步长和大感受野可以一次性覆盖图像…

C++语法08 数据类型之间的强制转换

目录 强制类型转换 强制类型转换格式 整型转换成浮点型 整型转换成浮点型其他写法 训练&#xff1a;糖果奖励 糖果奖励参考代码 浮点型转换成整型 浮点型转换成整型其他写法 训练&#xff1a;分离小数 分离小数参考代码 强制类型转换 强制类型转换&#xff0c;就是把…

如何应对生活中的不确定性:仁者安仁,知者利仁。

有较高自尊水平的人&#xff0c;接近于孔子说的&#xff1a;仁者。 ——— 有着稳定的高自尊&#xff0c;无论外在环境如何变化&#xff0c;对其影响都不大&#xff0c;他能够愉快地生活。 相反&#xff1a;一个人处于低自尊状态&#xff0c;就会活得很痛苦&#xff0c;对自己…

基于MCU平台的HMI开发的性能优化与实战(上)

随着汽车座舱智能化的不断演进&#xff0c;车内显示设备的数量显著增加&#xff0c;从传统的仪表盘和中控屏扩展至空调控制、扶手、副驾驶区域以及抬头显示&#xff08;HUD&#xff09;等多样化的显示单元。为了有效支持这些功能单元&#xff0c;同时控制整车成本&#xff0c;越…