Mysql数据库 19.Mysql 锁

MySQL锁

锁:锁是计算机用以协调多个进程间并发访问同一共享资源的一种机制,在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源,如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂

锁解决的问题

解决并发事物的访问问题,解决事务发生时造成的脏读、不可重复读、幻读等问题

锁的分类

按照锁的粒度分,分为以下三类锁:

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

2.表级锁:每次操作锁住操作表

3.行级锁:每次操作锁住操作的行数据

锁的范围、力度依次减小

全局锁(只读)

对整个数据库实例加锁,使整个库加锁后处于只读状态(不能增删改),使用该命令后,数据更新语句DML、数据定义语句DDL和更新类事物的提交语句等操作都会被阻塞

典型的应用是作全库逻辑备份,把所有表全部锁定,从而获取一致性视图,保证数据的完整性 

具体使用

1.添加全局锁

语法:flush tables with read lock;

flush tables with read lock;

添加全局锁后,不能使用任何增、删、改操作,可以使用查询操作,更新操作被阻塞

2.执行数据备份,利用MySQL提供的工具mysqldump

语法:mysqldump -uroot -proot 数据库名 > 具体存入脚本名称.sql

mysqldump -uroot -proot 数据库名 > 具体存入脚本名称.sql

3.备份之后,解锁指令(释放全局锁)

语法:unlock tables;

unlock tables;

演示:

添加全局锁
flush table with read lock; 

数据备份

释放全局锁
unlock table;

全局锁缺点(力度太大)

1.在备份期间不能执行更新操作,业务基本上就会停摆

2.如果有主从复制+读写分离的结构,在备份期间从库不能执行主库同步过来的二进制日志,会导致主从延迟。

 

表级锁 

表级锁,它的粒度为锁定整张表,每次操作锁住一张表,并且发生锁冲突的概率最高,并发度最低在InnoDB,MyISAM等常见储存引擎中支持

表级锁可分为三类

1、表锁        2、元数据锁        3、意向锁

1.表锁 

表锁分为两类

1.表共享读锁

2.表独占写锁

读锁(read):只能读,不能写

写锁(write):既能读,也能写

具体用法:

加锁

        lock table 表名(可以是多张表) read/write

解锁

        unlock tables 或 直接断开客户端连接(关闭客户端)

2.元数据锁 

元数据:简单理解为表结构

元数据实际上是系统自动控制的,不需要显示使用,当我们访问一张表的时候会自动加锁,主要作用就是维护表结构的数据一致性,当表中有活动事务存在时,是不允许操作元数据写入的

也就是如果有一张表有存在未提交的事务,不允许修改表结构,其目的就是为了避免DML与DDL冲突

元数据锁是系统自带的锁,只需了解

3.表锁:意向锁

意向锁是为了避免DML执行时,行锁与表锁的冲突,可以让表锁无需检查每行数据是否加锁,直接使用意向锁减少表锁的检查

意向锁判断依据是是否兼容,如果是可兼容的锁就可以直接加上,如果是排他锁则被阻塞,知道行锁释放

意向锁的作用:通过意向锁省略时间,不需要一行一行进行判断,可以直接判断意向锁是排他锁还是兼容锁 

意向锁的使用

意向锁分为两种类型:

        1.意向共享锁:select ...... lock in share mode 添加,与表共享锁(read)兼容,与表锁排他锁(write)互斥

        2.意向排他锁:insert、delete、select... for update添加,与表锁共享锁(read)及排他锁(write)都互斥,意向锁之间不会互斥

事务一旦提交,意向共享锁,意向排他锁,都会自动释放

查看意向锁及行锁加锁情况:

 行级锁

行锁也称为记录锁,锁住某一行,MySQL服务器层没有实行行锁机制,行级锁只在储存引擎实现

优点:锁的力度小,发生锁冲突概率低,可以实现高并发

缺点:对于锁的开销比较大,加锁会比较慢

1.行级锁的分类

1.行锁(记录锁):记录锁就是仅仅把一条记录锁上,仅仅锁住一条记录,对其他数据没有影响,防止其他事务对这条数据进行修改或删除操作

2.间歇锁:锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert插入操作,产生幻读,实际上这也是MySQL隔离级别 可重复读 隔离级别下,解决幻读的一种方案

3.临键锁:既想锁住某条记录,又想阻止其他事务在该记录前边的间隙插入新纪录,就是行锁和间隙锁组合,innodb默认采用临键锁

2. 行锁/记录锁

行锁的类型

在InnoDB引擎中实现了两种类型的行锁

        1.共享锁(s):允许一个事务读取一行,阻止其他事务获得相同数据的排它锁,简单理解就是共享锁和共享锁兼容和排它锁排斥

        2.排它锁(x):允许获取排它锁的事务更新数据,阻止其他事务获取相同的排它锁和共享锁

 

 锁模式兼容性

行级锁定实现方式——必定通过索引实现

 常见SQL语句执行时的加锁情况

行锁只能锁定当前行所在的一条数据,其他数据不被锁住 

行锁只有索引存在时才会生效,否则会生成表锁

间歇锁/临键锁

间隙锁:锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读

临键锁:既想锁定某条记录,又想阻止其他事务在该记录前边的间隙插入新记录,就是行锁和间隙锁组合,InnoDB默认的是临键锁

唯一索引等值查询 

当查询的记录是存在的,next-key lock 会退化成 当前记录的「记录锁」。 当查询的记录是不存在的,next-key lock 会退化成 当前记录所在区间的「间隙锁」。 

commit提交以后锁释放

非唯一索引等值查询(尽量避免) 

当查询的记录存在时,除了会加 next-key lock 外,还额外对下一区间加「间隙锁」。 首先先来给age字段添加普通索引

唯一索引范围查询 

对于给定范围中涉及到的值都加next-key lock,会访问到不满足条件的第一个值为止。 直接查询一个范围,并且添加共享锁,来查看 

加锁规则: 

1. 唯一索引等值查询: 当查询的记录是存在的,next-key lock 会退化成 当前记录的「记录锁」。 当查询的记录是不存在的,next-key lock 会退化成 当前记录所在区间的「间隙锁」。 2. 非唯一索引等值查询(不建议使用): 当查询的记录存在时,除了会加 next-key lock 外,还额外对上下区间加「间隙锁」。 3. 唯一索引范围查询: 对于给定范围中涉及到的值都加next-key lock,会访问到不满足条件的第一个值为 止。 

锁总结

什么是MySQL锁:

在并发访问时,解决数据一致性、有效性问题的解决方案,MySQL中的 锁是在服务器层或者存储引擎层实现的,我们所讲的所有锁的内容都是应用在InnoDB引擎 中的。

锁分为三种:全局锁、表级锁、行级锁

全局锁:对整个数据库实例加锁,粒度最大,加锁后整个数据库实例处于只读状态,性能较 差,一般用于数据库逻辑备份使用

表级锁:锁住整张操作的表,粒度也比较大,发生锁冲突概率比较高,具体分为:表锁(具 体分为读和写两种锁)、元数据锁(主要作用就是针对DML语句和DDL语句的冲突)、意向 锁(主要目的规避行锁与表锁的冲突问题,避免表锁再加锁时逐行扫描行锁,自动无需手动 操作)

行级锁:锁住对应操作表的具体行数据(针对索引),粒度最小,发生锁冲突的概率最小, 具体分为:行锁、间隙所、临键锁,要注意的是其中共享锁与共享锁是可以兼容的,但是与 排它锁,包括排它锁与排它锁之间都是互斥的 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#中的封装、继承和多态

1.引言 在面向对象的编程中,封装、继承和多态是三个重要的概念。它们是C#语言中的基本特性,用于设计和实现具有高内聚和低耦合的代码。本文将详细介绍C#中的封装、继承和多态的相关知识。 目录 1.引言2. 封装2.1 类2.2 访问修饰符 3. 继承4. 多态4.1 虚方…

高云GW1NSR-4C开发板M3核串口通信

1.PLLVR频率计算 高云的M3核要用到PLLVR核,其输出频率FCLKIN*(FBDIV_SEL1)/(IDIV_SEL1),但同时要满足FCLKIN*(FBDIV_SEL1)*ODIV_SEL)/(IDIV_SEL1)的值在600MHz和1200MHz之间。例如官方示例,其输入频率FCLKIN50MHz,要输出80MHz&am…

鸿蒙原生应用/元服务开发-Stage模型能力接口(三)

一、说明 AbilityLifecycleCallback模块提供应用上下文ApplicationContext的生命周期发生变化时触发相应回调的能力,包括onAbilityCreate、onWindowStageCreate、onWindowStageActive、onWindowStageInactive、onWindowStageDestroy、onAbilityDestroy、onAbilityFo…

一文弄懂自编码器 -- Autoencoders

1. 引言 近年来,自编码器(Autoencoder)一词在许多人工智能相关的研究论文、期刊和学位论文中被频繁提及。自动编码器于1980年推出,是一种用于神经网络的无监督学习技术,可以从未被标注的训练集中学习。 本文重点介绍…

指针进阶篇

指针的基本概念: 指针是一个变量,对应内存中唯一的一个地址指针在32位平台下的大小是4字节,在64位平台下是8字节指针是有类型的,指针类型决定该指针的步长,即走一步是多长指针运算:指针-指针表示的是两个指…

协方差和相关系数,还有信号与系统里的 互相关函数

协方差和相关系数参考:https://www.bilibili.com/video/BV1vK411N7Yp/ 协方差和相关系数的思想就是:同增同减,找相关的变量 协方差公式是如下图老师的板书 可以发现,当 X Y 同增同减趋势明显时,协方差的值就越大 所…

STM32_启动流程详解

目录标题 前言 启动流程概述复位中断函数详解SystemInit函数详解 __main函数详解 附录 stm32单片机的存储器映像中断向量表的映射 前言 最近在学习IAP远程OTA升级单片机固件程序,发现自己对单片机的启动流程还不是那么了解,就总结整理一下吧。 启动流程…

记录一次API报文替换点滴

1. 需求 各位盆友在日常开发中,有没有遇到上游接口突然不合作了,临时需要切换其他接口的情况?这不巧了,博主团队近期遇到了,又尴尬又忐忑。 尴尬的是临时通知不合作了,事前没有任何提醒; 忐忑…

位图、布隆过滤器、海量数据处理

文章目录 位图布隆过滤器海量数据处理 正文开始前给大家推荐个网站,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 位图 概念:所谓位图,就是用每一…

【Spring】08 BeanNameAware 接口

文章目录 1. 简介2. 作用3. 使用3.1 创建并实现接口3.2 配置 Bean 信息3.3 创建启动类3.4 启动 4. 应用场景总结 Spring 框架为开发者提供了丰富的扩展点,其中之一就是 Bean 生命周期中的回调接口。本文将聚焦于其中的一个接口 BeanNameAware,介绍它的作…

深度学习中的预测图片中的矩形框、标签、置信度分别是什么意思。

问题描述:深度学习中的预测图片中的矩形框、标签、置信度分别是什么意思。 问题解答: 目标框(Bounding Box): 描述目标位置的矩形边界框。 类别标签: 表示模型认为目标属于哪个类别(例如&#…

opencv 十六 python下各种连通域处理方法(按面积阈值筛选连通域、按面积排序筛选连通域、连通域分割等方法)

本博文基于python-opencv实现了按照面积阈值筛选连通域、按照面积排序筛选topK连通域、 连通域细化(连通域骨架提取)、连通域分割(基于分水岭算法使连通域在细小处断开)、按照面积排序赛选topK轮廓等常见的连通域处理代码。并将代码封装为shapeUtils类,在自己的python代码…

[Verilog] 设计方法和设计流程

主页: 元存储博客 文章目录 1. 设计方法2. 设计流程 3 Vivado软件设计流程总结 1. 设计方法 Verilog 的设计多采用自上而下的设计方法(top-down)。设计流程是指从一个项目开始从项目需求分析,架构设计,功能验证&#…

openEuler商业化进展可观:累计装机量超610万套,市场持续扩容

12月15日至16日,以“崛起数字时代,引领数智未来”为主题的操作系统大会&openEuler Summit 2023在北京国家会议中心举办。大会旨在汇聚全球产业界创新力量,构筑坚实的基础软件根基,推动基础软件技术持续创新&#xff0c…

Redis设计与实现之整数集合

目录 一、内存映射数据结构 二、整数集合 1、整数集合的应用 2、数据结构和主要操作 3、intset运行实例 创建新intset 添加新元素到 intset 添加新元素到 intset(不需要升级) 添加新元素到 intset (需要升级) 4、升级 升级实例 5、关于升级 …

帆软FCRP模拟题

制作步骤可见此博主:https://blog.csdn.net/Ipkiss_Yongheng/article/details/125594366 完成文件下载:【免费】帆软FCRP官网模拟题代码资源-CSDN文库

大创项目推荐 垃圾邮件(短信)分类算法实现 机器学习 深度学习

文章目录 0 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 垃圾邮件(短信)分类算…

5个创建在线帮助文档的好方法!

在线帮助文档是企业为用户提供支持服务的重要工具,它能够帮助用户更好地了解和使用产品,提高用户体验。然而,创建一份优秀的在线帮助文档需要掌握一定的技巧和方法。接下来就介绍一下创建在线帮助文档的5个好方法,帮助企业更好地为…

day05-报表技术-图形报表

1、图表报表简介 ​ 在大数据时代,人们需要对大量的数据进行分析,帮助用户或公司领导更直观的察觉差异,做出判断,减少时间成本,而在web项目中除了表格显示数据外,还可以通过图表来表现数据,这种…

一维数组的定义

什么是数组? (1)数组是具有一定顺序关系的若干变量的集合,组成数组的各个变量统称为数组的元素 (2)数组中的各元素的数据类型要求相同,用数组名和下标确定,数组可以是一维的&#…