10 Mysql中各种锁

news2024/11/19 20:15:38

概述

MySQL中的也存在一些类型的锁,用来保证多个连接同时操作数据时的安全即数据的一致性问题;同时,虽然锁能够解决一些数据的一致性和有效性,但是我们还是要选择合适的锁来降低锁对于并发问题的影响

1. 全局锁

全局锁就是对整个库进行加锁,所有的连接都只能进行读的操作,不能写(DDL、DML、以及更新操作的事务的提交语句都会被阻塞)

最典型的一个例子就是使用mysqldump命令对库进行备份的时候,将会锁定所有的表,从而保证数据的一致性

思考:假设没有全局锁,使用表锁,会出现什么情况?

  1. 假设有A、B三张表,一个完整的业务操作过来需要依次操作两张表
  2. 首先开始备份数据,开始备份A,锁住了表A;此时业务操作过来了由于A表被锁定无法写入数据;待A表备份完成后,执行了操作,修改了表A和表B
  3. 表B开始备份,锁定了B

我们可以发现,备份出来的A表缺少了这次操作的记录,而备份出来的B表中是包含这次操作的记录的;这就违背了数据的一致性;解决办法就是加上全局锁,锁住所有的表,保证所有的表只能被读而不能被写入

全局锁语法

# 加锁
flush tables with read lock;
# 解锁
unlock tables;
# 备份库的数据,在mysql外部执行;-h如果备份远程mysql服务需要加上参数host,schemal_name是表名,file_url + file_name是备份到本地的什么路径和文件名,--single-transation仅支持innodb引擎不添加全局锁,而是通过快照读保证数据的一致性
mysqldump [-h127.0.0.1] [--single-transaction] -uroot -p1234 schemal_name > file_url + file_name;

全局锁特点:数据库中添加全局锁是一个非常重量级的操作,存在以下问题:

  1. 如果在主库上备份就会导致所有写的操作无法执行,业务基本上都要停掉
  2. 如果在从库上备份,则备份期间不能执行主库同步过来的二进制日志(binlog),导致主从延迟

为了解决备份期间加全局锁的问题,Innodb引擎我们可以在备份的时候加上参数--single-transaction来完成不加锁的一致性数据备份,使用方式如上图

备份时不加全局锁的示意图:

在这里插入图片描述

2. 表级锁

表级锁每次操作锁住的是一张表,锁的粒度较大,并发程度较低。应用在Innodb、myisam引擎中

表级锁可以分为三种:表锁、元数据锁、意向锁

1. 表锁

表锁可以分为两类:表共享读锁 read和表独占写锁 write

假设有两个连接:A和B

  1. 表共享读锁:SHARE_READ_ONLY

    连接A在表上添加了共享读锁之后,A和B都只能读,不能写,所以叫做共享读

  2. 表独占写锁:SHARE_NO_READ_WRITE

    连接A在表上添加了独占写锁之后,A可以读也可以写,B什么都做不了,相当于A把表给独占了,所以叫独占写

语法:

# 加读锁或者写锁
lock tables 表名 read|write;
# 释放锁;断开客户端的连接也会导致释放锁
unlock tables;

读写锁:

在这里插入图片描述

2. 元数据锁 (meta data lock, MDL)

元数据锁存在的目的是为了:当有活动的事务存在的时候,锁住表的结构,防止修改表导致事务提交失败

这个锁是由程序自动控制的,无需手动添加;可以通过下面的sql查看元数据锁的添加情况

元数据锁有两种:MDL读锁MDL写锁

# 查看元数据记录是否开启
select * from performance_schema.setup_instruments where NAME ='wait/lock/metadata/sql/mdl';
# 开启元数据锁记录,当发生锁的情况时可以通过下方语句查看
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME ='wait/lock/metadata/sql/mdl';
# 查看元数据锁,从performance_schema库中的meta_data_lock查看
select object_type, object_schema, object_name, lock_type, lock_duration from performance_schema.metadata_locks;

这个不需要过多的分析,只要该表上有其他锁存在,就无法修改表结构

在这里插入图片描述

3. 意向锁

由于InnoDB引擎中进行查询如果能够使用到行锁,是会对数据加上对应的行锁,同时添加一个意向锁,这样子当另一个事务过来的时候,就不需要再去遍历索引查看有没有行锁,直接通过意向锁来进行判断是否可以执行

意向锁有两种;**意向共享锁IS和意向排他锁IX**两种

  1. 意向共享锁和意向排他锁之间是互相兼容的,否则没必要上意向锁直接用表锁就可以了;
  2. 意向共享锁兼容表共享读,不兼容表独占写;意向排他锁和其他都互斥

sql语句对应加锁类型

  1. select … lock in share加的意向共享锁
  2. insert、update、delete、select … fro update加**意向排他锁 **

可以通过下面sql查看意向锁加锁情况

# 查询performance_schema库中的data_lock,意向锁和行级锁都在这里
select object_schema, object_name, index_name, lock_type, lock_mode, lock_data from performance_schema.data_locks;

在这里插入图片描述

3. 行级锁

行级锁每次操作是锁住对应的记录,锁的粒度最小,并发程度最高,应用在Innodb引擎中

行级锁的实现基于索引,通过对索引项加锁来进行操作,不是锁住的记录,因此如果索引失效就不会应用到行级锁

行级锁主要分为三类:

  1. 行锁Record Lock,锁定单行记录,防止其他事务对此行进行udpate和delete。在RC、RR隔离级别下都支持
  2. 间隙锁Gap Lock,锁定索引记录间隙,不包含该记录,确保索引间隙不变,防止其他事务在这个间隙insert产生幻读。在RR隔离级别下支持
  3. 临键锁Next Key Lock,行锁和间隙锁组合,锁住数据和数据前面的间隙Gap。在RR隔离级别下支持

不同SQL添加的锁的类型

  1. 普通select:不加锁
  2. select … lock in share mode:共享锁
  3. insert、update、delete、select … for update:排他锁

可以通过下面sql查看加所情况

# 查询performance_schema库中的data_lock,意向锁和行级锁都在这里
select object_schema, object_name, index_name, lock_type, lock_mode, lock_data from performance_schema.data_locks;

在这里插入图片描述

1. 行锁

默认情况下Innodb使用可重复读RR的隔离级别,Innodb使用next-key锁进行搜索和索引扫描防止出现幻读

  1. 针对唯一索引,对已存在的纪录进行等值匹配时会自动优化为行锁
  2. 行级锁基于索引,如果使用过程中没有用到索引或者索引失效则升级为表锁

2. 间隙锁/临键锁

  1. 间隙锁存在的目的就是锁住间隙防止插入数据产生幻行;间隙锁可以共存,一个事务不会阻挡另一给事务在同一个间隙上加锁
  2. 针对唯一索引的等值查询,给不存在的记录加锁时临键锁优化为间隙锁
  3. 针对普通索引的等值查询,向右遍历时最后一个值不满足查询需求时,临键锁退化为间隙锁
  4. 针对唯一索引的等值查询,会访问到不满足条件的第一个值为止

间隙锁可以共存,一个事务不会阻挡另一给事务在同一个间隙上加锁
2. 针对唯一索引的等值查询,给不存在的记录加锁时临键锁优化为间隙锁
3. 针对普通索引的等值查询,向右遍历时最后一个值不满足查询需求时,临键锁退化为间隙锁
4. 针对唯一索引的等值查询,会访问到不满足条件的第一个值为止

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

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

相关文章

傻白探索Chiplet,互连技术研究现状(七)

目录 一、串行互连 二、并行互连 三、串行与并行互连的比较 四、互连标准接口 (1)背景 (2)UCIe Chiplet的可行性常常受到片间互连的性能、可用性以及功耗和成本问题的限制,各种异构芯片的互连接口和标准的设计在技…

Web3中文|恐惧vs伦理:AI艺术评论家错在哪里?

本周,人工智能引发众怒。随着“AI艺术”在网络的流行,一群艺术家正在知名艺术家平台Art Station上掀起一场反AI艺术的抗议活动,而人工智能技术的拥趸者也及时回击了这波反对热潮。 这种充斥着反对意见的热潮是迟早会出现的。现在这些人认为“…

简单说手什么是JWT?

JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。 传统的session认证 http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一…

【Lingo】【MATLAB】【求解运筹学问题模板题】

文章目录一、线性规划模型(Lingo)1.线性规划问题(模板)2.求解最优化问题3.包装箱平板车问题4.职员时序安排问题5.运输问题6.排菜单问题7.工地施工问题8.生产计划优化研究(柴油机生产)二、线性规划问题&…

机器学习算法基础——逻辑回归

01逻辑回归可以用来解决简单的二分类问题。 逻辑回归的预测函数为hθ(x)g(θTx)h_\theta (x)g(\theta^Tx)hθ​(x)g(θTx),其中g(x)g(x)g(x)为sigmoidsigmoidsigmoid函数,用于将数值映射到区间[0,1][0,1][0,1]中,然后再取对数值用于刻画损失函…

51单片机实训day3——点亮LED灯、闪烁LED灯(一)理论

内 容:编写代码实现LED灯的点亮功能 学 时:2学时 知识点:分析原理图、LED灯控制原理 重点:GPIO参数配置、LED原理图分析 难点:编写 GPIO参数配置函数、LED点亮函数 时间:2022年12月21日 9:00~…

实验1 数据库定义与操作语言实验

前言:实验本身并不是很难,照着实验指导书抄就行,不过注意有些sql语句和mysql语句是不相同的,需要进行一定的修改 数据集链接 实验1 数据库定义与操作语言实验 实验1.1 数据库定义实验 1.实验目的 理解和掌握数据库DDL语言&am…

指挥中心显示大屏类型简介

因工作需要,现在需要不断补充指挥中心建设过程中各种设备知识,怕被别人忽悠了也不知道,抓紧学习了解。今天学习大屏部分,目前来说,常见的显示大屏主要分为DLP拼接屏、LCD拼接屏和LED小间距大屏几种类型。 1、DLP大屏 …

【maven工程的pom.xml文件内部结构详解+maven工程的多层次依赖管理】

目录pom文件内部【结构详解】pom文件内部【依赖管理】1、依赖传递&#xff1a;2、依赖传递过程中&#xff0c;版本冲突&#xff1a;3、依赖传递过程中&#xff0c;对外隐藏主动断开&#xff1a;pom文件内部【依赖的作用范围】pom文件内部【结构详解】 <?xml version"…

【ARMv8 异常模型入门及渐进 11 - Linux 中断上下文 irq_enterirq_exit】

文章目录1.1 背景1.1.1 in_interrupt 定义1.1.2 irq_count 定义1.1.3 preempt_count 各域含义1.1.4 ARMv8 中断处理流程回顾1.1 背景 在 Linux 代码中经常会看到 WARN_ON(in_interrupt()); 或者 BUG_ON(in_interrupt()); 从名字可以看出这两句的含义是&#xff1a;如果当前处在…

运用手机多媒体之使用通知

文章目录使用通知将程序运行到手机上使用通知创建通知渠道通知的基本用法通知的进阶技巧setStyle()方法不同重要等级的通知渠道使用通知 将程序运行到手机上 在AS当中除了使用模拟器来运行我们的程序,还可以使用真机来运行我们写的程序想要将程序运行到手机上,首先需要将手机…

推荐系统学习笔记-推荐系统分布式离线训练

背景 在推荐、广告、搜索等互联网场景下&#xff0c;动则TB甚至PB级数据量。导致几乎不可能在传统单机环境下完成机器学习模型的训练。分布式机器学习训练成为称为唯一选择。 主要手段 • Spark MLlib • Parameter Server • Tensorflow Spark MLlib MLlib从功能上说与Sc…

如何利用地表温度遥感数据和气象资料计算农田地表水热通量

地表水热通量主要包括感热/显热通量和潜热通量&#xff0c;是陆-气交互以及水-热-碳循环研究的重要变量。其中&#xff0c;潜热通量是地表蒸散发的能量形式&#xff0c;对农业水资源管理、作物水分利用效率等非常关键。由于热红外遥感对地表干湿变化、以及农业干旱响应快速&…

WeakHashMap源码解析

WeakHashMap源码解析 简介 WeakHashMap 是一种 弱引用 map&#xff0c;内部的 key 会存储为弱引用&#xff0c;当 jvm gc 的时候&#xff0c;如果这些 key 没有强引用存在的话&#xff0c;会被 gc 回收掉&#xff0c;下一次当我们操作 map 的时候会把对应的 Entry 整个删除掉…

金融信息科技服务外包风险管理能力成熟度评估规范 学习笔记 附录下载地址

金融信息科技服务外包风险管理的范围 本标准规定了金融业信息科技服务外包风险管理能力成熟度评估体系以及对发包方和承包方的总体要求&#xff0c;分别对发包方、承包方的服务外包风险管理能力成熟度进行了分级定义&#xff0c;并规定了对发包方和承包方进行服务外包风险管理…

《OpenGL 模型》 渲染出帅气的暗影战士

模型Assimp流程网格模型效果Assimp 3D建模工具&#xff0c;可以让艺术家创建复杂的形状&#xff0c;Assimp库用于加载&#xff0c;如加载obj格式的文件到我们的程序之中&#xff0c;下载CMAKE用于构建该库&#xff08;会有很多问题&#xff09;&#xff0c;不过&#xff01;我…

【小程序】小程序代码的构成

目录 项目结构 1. 了解项目的基本组成结构 2. 小程序页面的组成部分 JSON配置文件 1. JSON 配置文件的作用 2. app.json 文件 3. project.config.json 文件 4. sitemap.json 文件 5. 页面的 .json 配置文件 6. 新建小程序页面 7. 修改项目首页 项目结构 1. 了解项…

别再用过时的方式了!全新版本Spring Security,这样用才够优雅!

基本使用 我们先对比下Spring Security提供的基本功能登录认证&#xff0c;来看看新版用法是不是更好。 升级版本 首先修改项目的pom.xml文件&#xff0c;把Spring Boot版本升级至2.7.0版本。 <parent><groupId>org.springframework.boot</groupId><art…

Lua 元表(Metatable)

在 Lua table 中我们可以访问对应的 key 来得到 value 值&#xff0c;但是却无法对两个 table 进行操作(比如相加)。 因此 Lua 提供了元表(Metatable)&#xff0c;允许我们改变 table 的行为&#xff0c;每个行为关联了对应的元方法。 例如&#xff0c;使用元表我们可以定义 …

STM32程序设计规范浅析

这篇博客写到“STM32基础知识篇”里&#xff0c;一方面是一个很好地对过往工作的总结&#xff0c;另一方面也是整个专栏撰写计划的开端&#xff0c;古人云&#xff1a;良好的开端是成功的一半&#xff0c;在文章的最后详细地规划了整个专栏后期的更新计划。 笔者前段时间休息的…