15天学习MySQL计划-锁(进阶篇)-第十天

news2024/11/29 0:45:11

15天学习MySQL计划-锁(进阶篇)-第十天

1.概述

1.介绍

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

2.分类

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

  1. 全局锁:锁定数据库中的所有表
  2. 表级锁:每次操作锁住整张表
  3. 行级锁:每次操作锁住对应的行数据

2.全局锁

1.介绍

​ 全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务条件语句都被阻塞。

​ 其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。

2.语法

1.添加全局锁

flush tables with read lock;

2.取消全局锁

unlock tables;
3.特点

数据库中加全局锁,是一个比较重的操作,存在以下问题:

  1. 如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。
  2. 如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导致主从延迟。

在innodb引擎中,我们可以在备份时加上一个参数–single-transaction参数来完成不加锁的一致性数据备份

mysqldump --single-transaction --uroot -p123456 库名 > 指定存放位置/xxx.sql

3.表级锁

介绍

​ 表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM,innoDB,BDB等存储引擎中。

对于表级锁,主要分为以下三类:

1.表锁

对于表锁,分为两类:

  1. 表共享读锁(read lock)
  2. 表独占写锁(write lock)

注意:
读锁不会阻塞其他客户端的读,但是会阻塞写。当前会话也是只可以读,不可以写

​ 写锁即会阻塞其他客户端的读,又会阻塞其他客户端的写,当前会话不会读和写

语法:

加锁:lock tables 表名 read/write
释放锁:unlock tables / 客户端断开连接
2.元数据锁(meta data lock,MDL)

​ MDL加锁过程是系统自动控制的,无需显式使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。为了避免DML与DDL冲突,保证读写的正确性。

在MySQL5.5中引用了MDL,当对一张表进行增删改查的时候,加MDL读锁(共享);当对表结构进行变更操作的时候,加MDL写锁(排他)。

对应SQL锁类型说明
lock tables xxx read / writeshared_read_only / shared_no_read_write读写和写锁
select,select…lock in share modeshared_read与shared_read,shared_write兼容,与exclusive互斥
insert,update,dalete,select,for… updateshared_write与shared_read,shared_write兼容,与exclusive互斥
alter table …exclusive与其他的MDL都互斥

查看元数据锁

select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;
3.意向锁

​ 为了避免DML在执行时,加的行锁与表锁的冲突,在innodb中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。

1.意向共享锁(IS):由语句select…lock in share mode添加

2.意向排他锁(IX):由insert,update,delete,select … for update添加

互斥情况

1.意向共享锁(IS):与表锁共享(read)兼容,与表锁排他锁(write)互斥。

2.意向排他锁(IX):与表锁共享锁(read)及排他锁(write)共互斥。意向锁之间不会互斥

可以通过以下SQL,查看意向锁及行锁的加锁情况


4.行级锁

介绍

​ 行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在innodb存储引擎中。

​ innodb的数据是基于索引组织的,行锁是通过对索引上的索引项加锁的来实现的,而不是对记录加的锁。对于行级锁,主要分为以下三类:

  1. 行锁(record lock):锁定单个行记录的锁,防止其他事务对此进行update和delete。在RC,RR隔离级别下都支持。
  2. 间隙锁(gap lock):锁定索引记录间隙(不含该记录),确保索引记录间接不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持。
  3. 临键锁(next-key lock):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap,在RR级别下支持。

间隙锁图:

请添加图片描述

1.行锁

innodb实现了以下两种类型的行锁:

1.共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。

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

当前锁类型\请求锁类型S(共享锁)X(排他锁)
S(共享锁)兼容冲突
X(排他锁)冲突冲突
2.在什么情况下会进行行锁:
SQL行锁类型说明
insert排他锁自动加锁
update排他锁自动加锁
delete排他锁自动加锁
select(正常)不加任何锁
select … lock in share mode共享锁需要手动在select之后加上lock in share mode
select … for update排他锁需要手动在select之后加上for update
3.行锁-演示

默认情况下,innodb在repeatable read事务隔离级别运行下,innodb使用next-key锁进行搜索和索引扫描,以防止幻读。

  1. 针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。
  2. innodb的行锁是针对与索引加的锁,不通过索引条件检索数据,那么innodb将对表中的所有记录加锁,此时就会升级为表锁

请添加图片描述

4.间隙锁/临时锁-演示

默认情况下,innodb在repeatable read事务隔离级别运行,innodb使用next-key锁进行搜索和索引扫描,以防止幻读。

  1. 索引上的等值查询(唯一索引),给不存在的记录加锁时。优化为间隙锁。
  2. 索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock退化为间隙锁。
  3. 索引上的范围查询(唯一索引),会访问到不满足条件的第一个值为止。

注意:间隙锁唯一目的是防止其他事务插入间隙,间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用间隙锁。

5.总结

1.概述

  • 在并发访问时,解决数据访问的一致性,有效性问题
  • 全局锁,表级锁,行级锁

2.全局锁

  • 对整个数据库实例加锁,加锁后整个实例就处于只读状态。
  • 性能差,数据逻辑备份时使用

3.表级锁

  • 操作锁着表,锁定粒度大,发生锁冲突的概率高
  • 表锁,元数据锁,意向锁

4.行级锁

  • 操作锁住对应的行数据,锁定粒度最小,发生锁冲突的概率低
    概述

  • 在并发访问时,解决数据访问的一致性,有效性问题

  • 全局锁,表级锁,行级锁

2.全局锁

  • 对整个数据库实例加锁,加锁后整个实例就处于只读状态。
  • 性能差,数据逻辑备份时使用

3.表级锁

  • 操作锁着表,锁定粒度大,发生锁冲突的概率高
  • 表锁,元数据锁,意向锁

4.行级锁

  • 操作锁住对应的行数据,锁定粒度最小,发生锁冲突的概率低
  • 行锁,间隙锁,临键锁

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

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

相关文章

java实现NER模型识别问题中的实体

代码如下&#xff1a; String question "飞毛腿hw4x精品电池适用于哪些机型&#xff1f;";//1、NER模型识别问题中的实体List<String> list1 com.colorbin.rpa.c_magic_ai.c02_nlp.nlpUtil.getPerson(new String[]{question});List<String> list2 co…

完整数据分析体系概述

一、建设的出发点 满足业务需求&#xff0c;是建设数据分析体系的出发点&#xff0c;也是最终目的和最高要求。要注意的是&#xff0c;“业务需求”并没有统一的标准。不同部门&#xff0c;不同身份的人&#xff0c;需求是不一样的。从大的方面看&#xff0c;可以分作三个层级…

用户界面对象的线程亲缘性第一篇: 窗口

不同的对象具有不同的线程亲缘性规则&#xff0c;但其基本原则来自古老的 16 位 Windows。 在 Windows 系统上&#xff0c;最重要的用户界面对象当然是窗口了。窗口对象有它自己的线程亲缘性。创建窗口的线程是与窗口具有不可分割关系的线程。非正式地说&#xff0c;线程”拥有…

Pytorch激活函数最全汇总

为了更清晰地学习Pytorch中的激活函数&#xff0c;并对比它们之间的不同&#xff0c;这里对最新版本的Pytorch中的激活函数进行了汇总&#xff0c;主要介绍激活函数的公式、图像以及使用方法&#xff0c;具体细节可查看官方文档。 目录 1、ELU 2、Hardshrink 3、Hardsigmoid…

分屏视图上线,详情数据秒切换

分屏视图 路径 表单 >> 表单设计 功能简介 新增「分屏视图」。分屏视图是一种对数据阅读提供沉浸式体验的视图组织形式&#xff0c;用户可通过分屏视图更快速的查看数据详情。 使用场景&#xff1a; 对于数据类型是「订单」数据的表单&#xff0c;管理人员往往会对…

pandas的使用

Pandas 的使用 **介绍:**pandas 是 python 语言的的一个关于数据分析的扩展库&#xff1b;pandas 可以对各种数据进行操作, pandas 依赖于 numpy &#xff0c;在常规的数据分析中&#xff0c;pandas 的使用范围是最宽广的; 参考文章:https://www.runoob.com/pandas/pandas-tu…

VScode安装问题

1、编译运行的时候会产生正在启动生成… D:\install\vscode\vscode&MinGW\x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0\mingw64\bin\gcc.exe -fdiagnostics-coloralways -g D:\install\vscode\Folder\hello.c -o D:\install\vscode\Folder\hello.exe ‘D:\install\vscode\…

服务端实时推送技术之SSE(Server-Send Events)

文章目录 前言一、解决方案&#xff1a;1、传统实时处理方案&#xff1a;2、HTML5 标准引入的实时处理方案&#xff1a;3、第三方推送&#xff1a; 二、SSE&#xff1a;1、客户端&#xff1a;2、服务端&#xff1a; 三、业务实践&#xff1a;总结&#xff1a; 前言 服务端推送…

JavaWeb之过滤器Filter

今天开发遇到了&#xff0c;简单记录一下&#xff01; 简介&#xff1a;Filter是JavaWeb三大组件之一&#xff08;Servlet程序、Listener监听器、Filter过滤器&#xff09; 作用&#xff1a;既可以对请求进行拦截&#xff0c;也可以对响应进行处理。 1、Filter中的三个方法 …

人类 vs AI:玩梗大作战,看看谁是最后的赢家?

能解释人类玩梗的 AI 究竟能多大程度地理解人类的「梗」&#xff1f; 五一假期就在眼前&#xff0c;LigaAI 小编每天都在「调休好烦」和「快放假啦」两种情绪间反复横跳&#xff0c;还会忍不住思考「AI 能不能理解调休和放假的情绪差异&#xff1f;」&#xff08;一些精神世界高…

xilinx block design address editor 计算

xilinx block design address editor 计算 1k 0x000 ~ 0x3ff 10bit 1m 00000 ~ FFFFF 20bit 每个pcie 配置空间有4k 【11:0】 PCIe 配置空间 (PCIe Configuration Space) PCIe Spec中定义&#xff1a;每个PCIe Function都有 4096 Byte 的配置空间(Configuration Space)。前256…

基于机器学习的纠错系统技术 - 智能文本纠错 API

引言 在过去的几十年里&#xff0c;文本纠错技术已经取得了巨大的进展&#xff0c;从最初的基于规则的纠错系统到现在的基于机器学习的纠错系统&#xff0c;技术的发展已经帮助人们解决了大量的文本纠错问题&#xff0c;随着机器学习技术的发展&#xff0c;文本纠错技术也发生…

WINCC 趋势判断

项目函数 //状态: //稳定 2 //稳定 //递增 -1 //无序 0 //波动 //递减 1 int ordered(double *Trend_data, int Trend_len) {int Trend_out 0,Order 0;if (Trend_len 1){return 2;}Trend_out (Trend_data[0] < Trend_data[1]) - (Trend_data[0] > Trend_da…

input 各类事件汇总触发时机触发顺序

今天梳理了一下input框的各类事件&#xff0c;简单介绍一下吧 目录 1.click 2.focus 3.blur 4.change 5.input 6.keydown 7.keyup 8.select 1.click 点击事件&#xff0c;简单易理解&#xff0c;点击触发&#xff0c;等下跟focus事件一起比较 2.focus 获取焦点事件…

新能源行业雨水除铊,污水中铊超标的解决方法

锂电行业的发展会带动相关产业的发展&#xff0c;例如锂电池原材料和生产设备的制造、电池回收和处理等&#xff0c;这些产业的发展可能也会带来铊排放问题。除了锂电池生产过程中可能存在的铊污染外&#xff0c;企业的生活污水也可能含有铊&#xff0c;因为铊是一种广泛存在于…

Java面试题总结 | Java面试题总结6-MYSQL模块(持续更新)

Mysql 文章目录 Mysql关系型数据库和非关系型数据库的区别什么是ORM?-**mybatis**如何评估一个索引创建的是否合理&#xff1f;Count函数执行效果上&#xff1a;执行效率上&#xff1a;count(主键)和count(列名) 数据库的三大范式Mysql中char和varchar的区别数据库设计或者功能…

【科普知识】电机的10种工作制说明:S1~S10

如今&#xff0c;在我们的生活中&#xff0c;电机几乎无处不在&#xff0c;从国防、工农、运输、临床器械、通讯到生活中的洗衣机、风扇、吸尘器、电动机器人等&#xff0c;都在应用着各式各样的电动机。 电机作为一种能够将电能转换成机械能的装置&#xff0c;是现代工业生产和…

Elisp之检测函数运行时,在它之前执行别的程序(六)

公众号&#xff1a;Android系统攻城狮 简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&am…

OpenGLES 实验室之2D篇 第三弹 の 直播白板

本文字数&#xff1a;4555字 预计阅读时间&#xff1a;12分钟 笔者之前发表的音视频文章&#xff0c;有图像的处理&#xff0c;音频的重采样等等&#xff0c;都属于入门级别。通过阅读它们&#xff0c;读者能对音视频有了了解。可在 Gitee 上面回顾。 2023 年&#xff0c;笔者将…

如何使用depcheck检查vue和react的依赖,以后不用把时间浪费在依赖问题上了

当我们在开发 JavaScript 项目时&#xff0c;会引入各种依赖库。但是有些依赖库可能只用到了部分功能&#xff0c;或者已经不再需要了&#xff0c;但是却一直被保留在项目中。 这些未使用的依赖库会占据项目的空间&#xff0c;增加项目的复杂度&#xff0c;影响项目的性能。为…