Mysql数据库 19.Mysql 锁

news2024/11/15 3:56:52

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语句的冲突)、意向 锁(主要目的规避行锁与表锁的冲突问题,避免表锁再加锁时逐行扫描行锁,自动无需手动 操作)

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

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

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

相关文章

【MySQL备份】MySQL备份工具-MyDumper

目录 什么是MyDumper MyDumper优势有哪些 如何安装MyDumper 参数解释 1 mydumper参数解释 备份流程 一致性快照如何工作? 如何排除(或包含)数据库? 输出文件 Metadata文件 ​编辑 表数据 文件 表结构 文件 建库文件…

关于uview-ui的u-tabs标签滑块不居中的问题

在uniapp中,打开文件 uni_modules/uview-ui/components/u-tabs/u-tabs.vue 然后在style中添加以下代码即可 /deep/ .u-tabs__wrapper__nav__line {left: 18rpx; } 之前效果图: 之后效果图: 注意,代码中的18rpx需要自行调整

半导体:Gem/Secs基本协议库的开发(5)

此篇是1-4 《半导体》的会和处啦,我们有了协议库,也有了通讯库,这不得快乐的玩一把~ 一、先创建一个从站,也就是我们的Equipment端 QT - guiCONFIG c11 console CONFIG - app_bundle CONFIG no_debug_release # 不会生…

深入理解JVM设计的精髓与独特之处

这是Java代码的执行过程 从软件工程的视角去深入拆解,无疑极具吸引力:首个阶段仅依赖于源高级语言的细微之处,而第二阶段则仅仅专注于目标机器语言的特质。 不可否认,在这两个编译阶段之间的衔接(具体指明中间处理步…

C语言----文件操作(二)

在上一篇文章中我们简单介绍了在C语言中文件是什么以及文件的打开和关闭操作,在实际工作中,我们不仅仅是要打开和关闭文件,二是需要对文件进行增删改写。本文将详细介绍如果对文件进行安全读写。 一,以字符形式读写文件&#xff…

一文搞懂OSI参考模型与TCP/IP

OSI参考模型与TCP/IP 1. OSI参考模型1.1 概念1.2 数据传输过程 2. TCP/IP2.1 概念2.2 数据传输过程 3. 对应关系4. 例子4.1 发送数据包4.2 传输数据包4.3 接收数据包 1. OSI参考模型 1.1 概念 OSI模型(Open System Interconnection Reference Model)&a…

MLX:苹果 专为统一内存架构(UMA) 设计的机器学习框架

“晨兴理荒秽,带月荷锄归” 夜深闻讯,有点兴奋~ 苹果为 UMA 设计的深度学习框架真的来了 统一内存架构 得益于 CPU 与 GPU 内存的共享,同时与 MacOS 和 M 芯片 交相辉映,在效率上,实现对其他框架的降维打…

【后端卷前端3】

侦听器 监听的数据是 data()中的动态数据~响应式数据 <template><div><p>{{showHello}}</p><button click"updateHello">修改数据</button></div> </template><script>export default {name: "goodsTe…

cesium 自定义贴图,shadertoy移植教程。

1.前言 cesium中提供了一些高级的api&#xff0c;可以自己写一些shader来制作炫酷的效果。 ShaderToy 是一个可以在线编写、测试和分享图形渲染着色器的网站。它提供了一个图形化的编辑器&#xff0c;可以让用户编写基于 WebGL 的 GLSL 着色器代码&#xff0c;并实时预览渲染结…

人工智能与大数据的紧密联系

随着科技的飞速发展&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;和大数据&#xff08;Big Data&#xff09;已成为当今社会的热门话题。人工智能在许多领域的应用越来越广泛&#xff0c;而大数据则提供了支持和驱动AI技术的巨大资源。本…

Android13适配所有文件管理权限

Android13适配所有文件管理权限 前言&#xff1a; 很早之前在Android11上面就适配过所有文件管理权限&#xff0c;这次是海外版升级到Android13&#xff0c;由于选择相册用的是第三方库&#xff0c;组内的同事没有上架Google的经验直接就提交代码&#xff0c;虽然功能没有问题…

14. JDBC

1. JDBC基础 • JDBC的全称是 Java Database Connectivity&#xff0c;即Java数据库连接&#xff0c;它是一种可以执行SQL语句的Java API。 • Java API是接口&#xff0c;其实现类由各数据库厂商提供实现&#xff0c;这些实现类就是“驱动程序”。 2.JDBC编程步骤 导入驱动…

[GXYCTF2019]Ping Ping Ping (文件执行漏洞)

本题考点&#xff1a; 1、命令联合执行 2、命令绕过空格方法 3、变量拼接 1、命令联合执行 ; 前面的执行完执行后面的| 管道符&#xff0c;上一条命令的输出&#xff0c;作为下一条命令的参数&#xff08;显示后面的执行结果&#xff09;|| 当前面的执行出错时&#xff08;为…

day04-报表技术PDF

1 EasyPOI导出word 需求&#xff1a;使用easyPOI方式导出合同word文档 Word模板和Excel模板用法基本一致&#xff0c;支持的标签也是一致的&#xff0c;仅仅支持07版本的word也是只能生成后缀是docx的文档&#xff0c;poi对doc支持不好所以easyPOI中就没有支持doc&#xff0c…

字节与位在物联网传输协议中的使用

1个字节(byte) 8个位(bit) 如下例子&#xff0c;是一个上报数据类型的表格&#xff0c;总有48位(6个字节) 假如报文给的数据类型数据是&#xff1a; 0x06 时&#xff0c;06十六进制转为二进制&#xff0c;结果是00000110 那么在图下就是 (bit1 和 bit2 都为 1) &#xff…

Python中的程序逻辑经典案例详解

我的博客 文章首发于公众号&#xff1a;小肖学数据分析 Python作为一种强大的编程语言&#xff0c;以其简洁明了的语法和强大的标准库&#xff0c;成为了理想的工具来构建这些解决方案。 本文将通过Python解析几个经典的编程问题。 经典案例 水仙花数 问题描述&#xff1a…

Python 爬虫之简单的爬虫(一)

爬取网页上所有链接 文章目录 爬取网页上所有链接前言一、基本内容二、代码编写1.引入库2.测试网页3.请求网页4.解析网页并保存 三、如何定义请求头&#xff1f;总结 前言 最近也学了点爬虫的东西。今天就先给大家写一个简单的爬虫吧。循序渐进&#xff0c;慢慢来哈哈哈哈哈哈…

关于技术架构的思考

技术选型实则是取舍的艺术 这句话是我偶然在一篇技术架构方面的文章上看到的&#xff0c;每当我需要给新项目进行技术选型&#xff0c;决定技术架构时&#xff0c;一直坚信的。 当我们做技术选型时&#xff0c;需要考虑的东西非常多。比如&#xff0c;用关系型数据库还是非关…

Linux 中的网站服务管理

目录 1.安装服务 2.启动服务 3.停止服务 4.重启服务 5.开机自启 6.案例 1.安装服务 网址服务程序 yum insatll httpd -y 查看所有服务 systemctl list-unit-files 2.启动服务 systemctl start httpd 查看服务进程&#xff0c;确认是否启动 ps -ef|grep httpd 3.停止…

关联规则 关联规则概述

关联规则概述 关联规则 (Association Rules) 反映一个事物与其他事物之间的相互依存性和关联性。如果两个或者多个事物之间存在一定的关联关系&#xff0c;那么&#xff0c;其中一个事物就能够通过其他事物预测到。 关联规则可以看作是一种IF-THEN关系。假设商品A被客户购买&…