MySQL-锁

news/2024/4/30 1:25:19/文章来源:https://blog.csdn.net/qq_52751442/article/details/126924050

MySQL-锁

锁分类

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

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

全局锁

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

    FLUSH TABLES WITH READ LOCK;
    
  • 释放锁

    UNLOCK TABLES;
    
数据备份
  • 通常,我们为了保障多张表的数据一致性,在数据备份时我们会打开全局锁后进行数据备份,等待数据备份完成后对锁进行释放

  • MySQL为我们提供了一个数据备份工具mysqldump,我们可以通过以下命令进行数据备份

    mysqldump -uroot –proot dbname > xxx.sql
    
  • 但是数据库开启全局锁时,会导致整体的业务摆停,所以为了解决这个问题,在InnoDB引擎中,我们可以在备份时加上参数 --single-transaction 参数来完成不加锁的一致性数据备份

    mysqldump --single-transaction -uroot –proot dbname > xxx.sql
    
特点

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

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

表级锁

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

对于表级锁分为以下三类

  • 表锁
  • 元数据锁(Meta Data Lock)
  • 意向锁
表锁

对于表锁,分为两类:

  • 表共享读锁(read lock)
  • 表独享写锁 (write lock)

语法

  • 加锁

    LOCK TABLES 表名 ... READ/WRITE
    
  • 释放锁

    UNLOCK TABLES / 客户端释放连接
    

特点

  • 当线程A对表加上读锁时,线程A可以读但是不可以对表进行写操作,不会影响线程B的读但是会阻塞线程B的写,等待线程A释放读锁
  • 当线程A对表加上写锁时,线程A可以进行读操作,也可以进行写操作,线程B既不能读也不能写
元数据锁

介绍

  • 元数据锁,简称为MDL,作用主要是维护表的元数据的一致性,在表存在未提交的事务时防止表的结构被修改,MDL锁的加锁过程由系统自动控制,无需显示加锁
  • 当对一张表执行增删改查操作时会自动添加DML读共享锁,当对表结构进行变更操作的时候,加DML排他锁

常见SQL操作所加的元数据锁

在这里插入图片描述

  • 当执行SELECT、INSERT、UPDATE、DELETE等语句时,添加的是元数据共享锁(SHARED_READ /SHARED_WRITE),之间是兼容的
  • 当执行SELECT语句时,添加的是元数据共享锁(SHARED_READ),会阻塞元数据排他锁(EXCLUSIVE),之间是互斥的

查看数据库中的元数据锁情况

select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks ;
意向锁
  • 为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查
  • 如何理解意向锁:当行锁存在时对表添加表锁时需要对表进行扫描,确定行锁和表锁不冲突时才可以添加表锁,效率低下,所以在INNODB引擎中引出了表意向锁,它锁住的是整张表,当需要添加表锁时只需要确认表锁和表意向锁不冲突就可以快速添加表锁了,不需要再对表进行扫描

分类

  • 意向共享锁(IS): 由语句select … lock in share mode添加,与表锁共享锁(read)兼容,与表锁排他锁(write)互斥
  • 意向排他锁(IX): 由insert、update、delete、select…for update添加,与表锁共享锁(read)及排他锁(write)都互斥,意向锁之间不会互斥
  • 一旦事务提交了,意向共享锁、意向排他锁,都会自动释放

查看意向锁和行锁加锁情况

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;

兼容情况

  • 意向共享锁与表读锁是兼容的,与表写锁互斥
  • 意向排他锁与表读锁和表写锁都是互斥的

行级锁

介绍
  • 行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中
  • 注意:InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁
分类
  • 行锁(行数据锁 Record Lock):锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持
  • 间隙锁(Gap Lock):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持
  • 临键锁(Next-Key Lock):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持

在这里插入图片描述

行数据锁

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

  • 共享锁(S):允许一个事务去读一行,阻止其他事务对该行进行写操作
  • 排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务对该行进行读和写操作

兼容情况:

  • 行共享锁兼容行共享锁,不兼容行排他锁(不允许写操作)
  • 行排他锁不兼容行共享锁,也不兼容行排他锁

SQL执行时加行锁情况:
在这里插入图片描述

  • 默认情况下,InnoDB在 REPEATABLE READ事务隔离级别运行,InnoDB使用 next-key(临键) 锁进行搜索和索引扫描,以防止幻读
  • 针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁
  • InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁
间隙锁&临键锁
  • 索引上的等值查询(唯一索引),给不存在的记录加锁时, 优化为间隙锁

    SELECT ... WHERE ID=XXX LOCK IN SHARE MODE; -- ID不存在
    
  • 索引上的等值查询(非唯一普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock(临键锁)退化为间隙锁

  • 索引上的范围查询(唯一索引),会访问到不满足条件的第一个值为止

在这里插入图片描述

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

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

相关文章

Koltin协程:异步热数据流的设计与使用

一.异步冷数据流 在Kotlin协程:协程的基础与使用中,通过使用协程中提供的flow方法可以创建一个Flow对象。这种方法得到的Flow对象实际上是一个异步冷数据流,代码如下: private suspend fun test() {val flow flow {emit(1)emit(…

ESP8266升級SDK到V3.0版本編譯報錯

編譯報錯信息 bin/libmain2.a(app_main.o): In function `user_uart_wait_tx_fifo_empty: (.irom0.text+0x678): undefined reference to `user_pre_init bin/libmain2.a(app_main.o): In function `system_phy_freq_trace_enable: (.irom0.text+0x6e4): undefined reference t…

SpringCloud基础7——Redis分布式缓存

用于复习快速回顾。 目录 1.Redis持久化 1.1.数据备份文件RDB持久化方案 1.1.1.执行时机 1.1.2.RDB原理 1.1.3.小结,bgsave流程、执行时间、缺点 1.2.追加文件AOF持久化方案 1.2.1.AOF原理 1.2.2.AOF配置 1.2.3.AOF文件重写 1.3.RDB与AOF对比 2.Redis主…

getBean方法源码

一、 三个API // 根据name获取bean Override public Object getBean(String name) throws BeansException {return doGetBean(name, null, null, false); }// 根据name获取bean&#xff0c;如果获取到的bean和指定类型不匹配&#xff0c;则抛出异常 Override public <T>…

C++11 - 8 -智能指针

C11 - 智能指针前言&#xff1a;普通指针&#xff1a;安全隐患&#xff1a;其他函数异常&#xff1a;new函数异常&#xff1a;智能指针&#xff1a;RAII原理&#xff1a;smart_ptr&#xff1a;auto_ptr&#xff1a;管理权转移&#xff1a;优点&#xff1a;缺点&#xff1a;uniq…

报告分享|2022汽车生态营销白皮书

报告链接&#xff1a;http://tecdat.cn/?p28679 不确定性增加&#xff0c;消费意愿在压力下等待释放 今年3月以来&#xff0c;受国际冲突和国内环境双重影响&#xff0c;能源价格大幅上涨&#xff0c;导致全球供应不稳定趋势加深&#xff0c;宏观经济下行压力明显&#xff0…

程序设计竞赛-过了这个村没这个店

文章目录个人经验竞赛简介蓝桥杯天梯赛CCPCICPC其他个人经验 初闻不知曲中意&#xff0c;再闻已是曲中人。 标题无意夸张&#xff0c;但是竞赛生涯的时间真的不长&#xff0c;机会真的错过了就没有了。一般来说&#xff0c;大一打基础&#xff0c;学习编程语言、数据结构和算法…

Moment.js的常用函数、借助vue和Moment.js实现一个简单的时钟

前言 项目中关于时间的处理是挺常见的&#xff0c;虽然之前就知道有Moment.js这个库&#xff0c;但是一直没有接触过。只不过最近同事在项目中使用了&#xff0c;那也只能简单学习一下&#xff0c;不然遇到了完全看不懂。 本文只介绍一下常用的函数&#xff0c;其他内容可以在…

想换工作?那还不赶紧来看看这份面试题

引言 “寒冬”之下&#xff0c;诸如 “Android 凉了”之类的话我已经屡见不鲜了&#xff0c;现在互联网行业的热潮已经褪去&#xff0c;开始恢复冷静&#xff1b;这样一来&#xff0c;互联网公司就会面向大量的开发者们&#xff0c;因此对应的要求只会越来越高&#xff1b;据反…

用纯css实现一个图片拼接九宫格

<style> body{ margin: 0; padding: 0; // 设定居中 display: flex; justify-content: center; align-items: center; height: 100vh; } .container{ width: 300px; height: 300px; display: flex; // 子盒子布局&#xff0c;要让子盒子之间有间隙就把宽高设大一些。 jus…

报告分享|2022年中国机器人产业图谱及云上发展研究报告

报告链接&#xff1a;http://tecdat.cn/?p28681 报告在分析当前我国机器人市场现状与产业图谱的基础上&#xff0c;对人工智能、5G、云计算、边缘计算等新兴技术赋能机器人智能化、轻量化、柔性化发展进行了理性探讨&#xff0c;结合阿里云加速器企业案例探讨了机器人企业的上…

连接查询-mysql详解(五)

上篇文章说了&#xff0c;mysql5.6.6版本之前数据默认在系统表空间&#xff0c;之后默认在独立表空间&#xff0c;innodb因为索引和数据在一个b树&#xff0c;所以两个文件&#xff0c;一个文件结构&#xff0c;一个存数据&#xff0c;myISAM则是三个文件。一个聚簇索引有两个段…

小程序云开发学习笔记

小程序云开发学习笔记 初始化 在app.js里面 小程序一开始就初始化&#xff0c;多次调用只有第一次触发 onLaunch() { console.log("小程序打开"); wx.cloud.init({ env: ayang-8g50ew302a3a6c5a, //云开发id }) } 数据库操作 查询&#xff08;一定要配置数据权限&a…

高等工程数学 —— 第一章 (1)距离与范数

前言 研一生活开始了&#xff0c;看了大家对我之前博客的鼓励让我知道写博客是一件多么有意义的事情。写这些让我遇见许多陌生的有缘人&#xff0c;有老骥伏枥的大叔、也有可爱温暖的学妹…… 这里将高等工程数学的笔记留给不爱吃香菜的月亮&#xff0c;希望这些陪伴过我的微光…

ElasticSearch(四)【高级查询】

四、高级查询 说明 ES中提供了一种强大的检索数据方式&#xff0c;这种检索方式称之为Query DSL&#xff0c;Query DSL是利用Rest API传递JSON格式的请求体&#xff08;Request Body&#xff09;数据与ES进行交互&#xff0c;这种方式的丰富查询语法让ES检索变得更强大&#xf…

Grafana alert预警+钉钉通知

1 Grafana alert预警 如下图所示&#xff0c;主要是前3步&#xff0c;设置alert rules、contact points 、notification policies。alert rules主要设置触发警告的规则&#xff1b;contact points设置通过什么发送预警&#xff0c;如钉钉&#xff1b;notification policies 将…

哲学家干饭问题 C++

哲学家干饭问题 C 哲学家就餐问题可以这样表述&#xff0c;假设有五位哲学家围坐在一张圆形餐桌旁&#xff0c;做以下两件事情之一&#xff1a;吃饭&#xff0c;或者思考。吃东西的时候&#xff0c;他们就停止思考&#xff0c;思考的时候也停止吃东西。餐桌上有五碗意大利面&am…

Vue2.0到3.0的过渡,setup,ref函数,reactive函数,计算属性computed

setup 1、Vue3.0的组件中所有用到的:数据、方法等等&#xff0c;均要配置在setup中&#xff0c;若要使用里面的数据&#xff0c;可以用return将其返回出来 2、若在setup中返回的是一个对象&#xff0c;则对象中的数据、方法、在模板中均可直接使用 例如 <template><di…

[Git] 系列三随意修改提交记录以及一些技巧

[Git] 系列三随意修改提交记录以及一些技巧 Author: Xin Pan Date: 2022.09.17 文章目录[Git] 系列三随意修改提交记录以及一些技巧整理提交记录未知提交号哈希值时怎么办&#xff1f;一些技巧本地栈式提交方法一方法二TagDescribe高级命令总结好了&#xff0c;大概总结好了。…

搭建游戏要选什么样的服务器?

服务器是游戏平台数据传输的重要载体&#xff0c;事关我们游戏创业发展的稳定性、安全性。那么&#xff0c;游戏平台搭建要选什么服务器&#xff1f;有什么参考指标&#xff1f;本文将带领大家一探究竟&#xff01; 首先是“游戏平台搭建要选择什么服务器”&#xff0c;我们可…