MySQL八股学习记录5MySQL锁from小林coding

news2024/10/5 22:22:10

MySQL八股学习记录5MySQL锁from小林coding

  • 锁的总览
    • 全局锁
    • 表级锁
      • 表锁
      • 元数据锁
      • 意向锁
      • AUTO-INC锁
    • 行级锁
      • Record Lock
      • Gap Lock
      • Next-Key-Lock
      • 插入意向锁
      • 行级锁是如何作用的
        • 唯一索引等值查询
      • 唯一索引范围查询
      • 非唯一索引等值查询

锁的总览

MySQL锁分为三种,分别是全局锁,表级锁,行级锁

全局锁

使用全局锁的方式

mysql<flush tables with read lock;

执行该命令后,整个数据库处于只读状态,数据的一切修改操作都会被阻塞
释放全局锁

mysql<unlock tables

全局锁的应用:全库逻辑备份
全局锁的局限:业务阻塞停滞
避免方式:当数据库的引擎支持可重复读的隔离级别,那么可以用事务来进行全库逻辑备份

表级锁

MySQL表级锁分类

  • 表锁
  • 元数据锁
  • 意向锁
  • AUTO-INC锁

表锁

加锁命令

lock tables tablename read;//共享锁
lock tables tablename write;//独占锁

表锁的限制:
**表锁的粒度太大,会影响并发性能,**一般情况下使用粒度更细的行级锁

元数据锁

元数据锁不需要显式的使用,当对数据库表进行操作时,会自动给这个表加上MDL

  • 对一张表进行CRUD操作时,加的是MDL读锁
  • 对一张表进行表结构更改时,加的是MDL写锁
    MDL释放时机:事务提交后
    数据库长事务对数据库的影响
    思考下述场景
  1. 事务A为长事务,执行select,加上MDL读锁
  2. 事务B企图修改表结构,这个时候想要MDL写锁,但是由于事务A的存在阻塞
    在这样的请款下,之后所有的查询都将会被阻塞,因为MDL的写锁优先级高于读锁,后续的CRUD操作将全部被阻塞
    反思:在改变表结构时,先看看数据库中的长事务,可以尝试kill掉长事务

意向锁

  • 使用InnoDB对某些记录上共享锁之前,需要在表级别上加上一个意向共享锁
  • 使用InnoDB对表中的某些记录上独占锁之前,需要先加上意向独占锁

当执行插入,更新,删除等操作时,需要对表加上意向独占锁,然后对具体的记录加锁,普通的select是不需要加锁的,普通的select通过MVCC完成一致性读,是无锁的
意向共享锁和意向独占锁是表级锁,不会与行级的独占锁和共享锁发生冲突.而且意向锁之间也不会发生冲突,只会和共享表锁,独占表锁发生冲突
意向锁作用:快速判断表里是否有记录被加锁

AUTO-INC锁

表里主键通常设置成自增的,插入数据时,可以不再指定主键的值,数据库会自动给主键赋递增的值,就是通过AUTO-INC锁实现
原理:AUTO-INC锁不再是一个事务提交后再释放,而是执行完插入语句后立刻释放

行级锁

行级锁三类:

  • Readcord Lock ,仅仅把一条记录锁上
  • Gap Lock,间隙锁,锁定一个范围,不包括记录本身
  • Next-Key-Lock:Recoed Lock + Gap Lock的组合,锁定一个范围,并且锁定记录本身

Record Lock

记录锁,锁住的是一条记录,记录锁有S锁和X锁的分别
在这里插入图片描述

Gap Lock

间隙锁,只存在可重复读级别,目的是为了解决可重复读下的幻读问题

Next-Key-Lock

Next-Key-Lock被称为临键锁,是Record+Gap Lock的组合,锁定一个前开后闭的范围,next-key lock 是包含间隙锁+记录锁的,如果一个事务获取了 X 型的 next-key lock,那么另外一个事务在获取相同范围的 X 型的 next-key lock 时,是会被阻塞的

插入意向锁

一个事务再插入一条记录时,判断插入位置是否被其他事务加了间隙锁,在此期间将生成一个插入意向锁

行级锁是如何作用的

不同场景,加锁的形式是不相同的
加锁的对象是索引,**基本单位是next-key-lock,**但在一些情况下,使用记录锁或者间隙锁就能避免幻读的情况下,next-key-lock将退化成记录锁或者间隙锁

唯一索引等值查询

唯一索引进行索引查询时,分为查询记录存在或者不存在

  • 存在:next-key-lock退化成record-lock
  • 不存在:找到第一条大于该记录的记录后,next-key-lock退化成gap-lock

唯一索引范围查询

范围查询会对每一个扫描到的索引加上next-key-lock,遇到下面的情况,会退化成记录锁或间隙锁

  • 大于等于的范围查询,若等于的记录存在表中,那么next-key-lock将退化成记录锁
  • 小于或者小于等于的范围查询:不在表中那么退化成gap-lock,在表中并且小于那么gap-lock,在表中小于等于不退化

非唯一索引等值查询

一个主索引,一个非唯一索引,那么加锁时,同时对两个索引都加锁,但对主键索引加锁的时候,仅在满足查询条件的记录才会对他们的主键索引加锁

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

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

相关文章

模拟行走机器人-python

leetcode第874题 链接https://leetcode.cn/problems/walking-robot-simulation 机器人在一个无限大小的 XY 网格平面上行走&#xff0c;从点 (0, 0) 处开始出发&#xff0c;面向北方。该机器人可以接收以下三种类型的命令 commands &#xff1a; -2 &#xff1a;向左转 90 度…

文本挖掘 day4 基于PMC知识框架文本挖掘的新能源汽车政策动态评价

基于PMC知识框架文本挖掘的新能源汽车政策动态评价 2. 研究设计2.1 研究技术路线2.2 数据采集2.3 动态分相 3. 基于PMC知识框架的策略动态挖掘3.1 PMC知识框架的建立3.2 基于PMC知识框架的策略挖掘字典3.2.1 字典建立步骤3.2.2 建立经验证据的词典 3.3 策略动态挖掘分析3.3.1 发…

python实现接口压力测试

python实现接口压力测试 直接上代码&#xff1a; # -*- coding: utf-8 -*-import json import requests import logginglogging.basicConfig(levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s) logger logging.getLogger(__name__)restime …

linux sed命令巨好用

sed命令介绍 find ./ -type d | grep rtos-kitfind ./ -type d 是一个在Linux终端中使用find命令的示例。让我们逐步解释这个命令&#xff1a; find: 这是用于在文件系统中查找文件和目录的Linux命令。 ./: 这是指当前目录&#xff08;工作目录&#xff09;&#xff0c;fin…

Java - List

List 接口基本介绍 1、List集合类中的元素是有序的&#xff0c;即添加顺序和取出顺序一致&#xff0c;先进先出。List中的元素可重复 2、List集合中的每个元素都有其对应的顺序索引&#xff0c;即支持索引 3、List容器中的元素都对应一个整数型的序号&#xff0c;记载其在容…

全国首个!武大又一新地标,有大势智慧的身影...

本文转载自武汉大学 数字缔造平行时空 古今交汇&#xff0c;千里相约 在武汉大学月湖旁的文科大楼里 藏着一个神秘的剧场 历史厚重的“文化遗产” 性能卓越的“智能计算” 据说这里有很多“新奇”剧目 见你所未见 闻你所未闻 快和珞珞珈珈一起去看看&#xff01; 珞珈…

重新设置mysql的root用户密码

创建一个txt文档&#xff0c;定义修改密码的SQL语句 ALTER USER rootlocalhost IDENTIFIED BY 1234567; 这里的localhost 表示只允许本地登录&#xff0c;如果改成%表示允许本地登录&#xff0c;也允许远程登录。 1234567就是新密码 管理员身份打开Windows PowerShell&#x…

【重温篇】八大排序——堆排序

完全二叉树 首先复习一下完全二叉树&#xff1a;数据从上到下&#xff0c;从左到右依次进行排列 堆排序 第一步 利用完全二叉树构建大顶堆 大顶堆&#xff1a;父节点的值大于或等于其左右孩子的值&#xff08;构建方法如下&#xff09; 1.定义一个parent游标&#xff0c;…

MyBatisPlus数据自动加解密存取和字段防篡改有效性校验码自动生成存储处理器

整体原理&#xff1a;用Mybatis拦截器拦截ResultSetHandler&#xff0c;做属性解密和完整性校奏。替换默认的ParameterHandler处理器。做属性加密存储和完整性加密存储。 代码结构如下&#xff1a; 各功能类解释&#xff1a; 1、EntityClassResolver&#xff1a;用于解析当前M…

Spring创建Ajax和接受Ajax数据-spring20

建一个AJAX.jsp页面 发送Ajax请求一般用jQuery 引入jQuery 引入文件&#xff1a; 弄一个请求 获得集合参数第二种应用场景 requestBody 的意思请求体 为什么找不到JQuery文件&#xff0c;原因是&#xff1a;前端控制器的配置&#xff1a;缺省&#xff0c;客户端发送请求&…

postgresql 数据库 面试题整理

postgresql 数据库 面试题整理 文章目录 postgresql 数据库 面试题整理前言pg数据库的特点&#xff1a;pg的优点pg的核心优势pg数据库的一些缺点PostgreSQL支持的各种数据类型pg的模式pg的多版本并发控制pg多版本并发控制&#xff08;MVCC&#xff09;介绍pg如何提供安全性Post…

vue3+vite配置 unplugin-vue-component 找不到 Vant 组件的问题

使用 vue3 vite Vant 搭建移动端项目&#xff0c;为了避免全量引入 vant 导致打包体积过大&#xff0c;又不想一个一个组件手动导入&#xff0c;所以就选择了 vant 官方推荐的方法&#xff0c;使用 unplugin-vue-components 插件自动引入组件&#xff0c;并按需引入组件的样式…

需求条目化与自动估算强强联合 助力软件估算自动化

痛点&#xff1a; 需求是产品的源头&#xff0c;是项目规模估算的基石。而传统的软件规模估算是由项目成员手工进行&#xff0c;对人员能力、经验、方法都有一定的要求&#xff0c;但是效果不好而且耗时费力&#xff0c;不能保持规模估算的一致性。 而导致这些问题的原因&#…

A plugin must either be a function or an object with an “install“ function

前言&#xff1a; 最近一个项目使用了vue3tsvite模型框架&#xff0c;在框架的基础之上进行的开发&#xff0c;开发过程中遇到一个问题&#xff0c;控制台有提示信息&#xff0c;如下图&#xff1a; 小小一行黄字&#xff0c;恶心人呀。。。 这话的意思大概是&#xff1a;插件…

中国人民大学与加拿大女王大学金融硕士--中外合作办学硕士领域的宝藏项目

大多数读研人都知道&#xff0c;从办学方式来看&#xff0c;中外合作办学硕士可以分为两种&#xff1a; 一是双学位教育项目&#xff0c;颁发的是外方高校硕士学位证书&#xff0c;同时还可以申请国内高校的硕士学位证书&#xff0c;同时教育部中留服还可以做学历学位认证。 二…

有哪些屏幕录制软件?这几种录屏工具了解一下

有哪些好用的屏幕录制软件呢&#xff1f;如果我们需要教别人如何使用某个软件或者如何完成某个任务&#xff0c;录屏也是非常有用的。可以通过录屏记录下整个过程&#xff0c;然后用于制作教程视频。也有小伙伴在打游戏时&#xff0c;遇到精彩操作有录屏的习惯&#xff0c;那么…

一文解惑mybatis中的#{}和${}

目录 基本概述 #{}的基本使用 ${}的基本使用 ${}使用情况 sql排序asc|desc 拼接表名 批量删除 模糊查询 基本概述 #{}&#xff1a;先编译sql语句&#xff0c;再给占位符传值&#xff0c;底层是PreparedStatement实现。可以防止sql注入&#xff0c;比较常用。 ${}&…

在Windows下安装Anaconda平台

Anaconda介绍 安装Python的方法有很多&#xff0c;其中利用Anaconda来安装&#xff0c;是最为安全和便捷的方法之一。在Python中安装类库&#xff0c;各个类库之间可能存在相互依赖、版本冲突等问题。为了解决这个问题&#xff0c;Python社区提供了方便的软件包管理工具&#…

css背景毛玻璃效果

一、结论&#xff1a;通过 css 的 backdrop-filter 属性设置滤镜函数 blur 一般会是有 背景色、透明度 的容器&#xff0c;如&#xff1a; /* 宽高等其他设置这里省略没写 */ background:rgba(3, 87, 255, 0.3); backdrop-filter: blur(10px);二、backdrop-filter 的其他用法…

ffmpeg学习之音频解码数据

音频数据经过解码后会被保存为&#xff0c;pcm数据格式。而对应的处理流程如下所示。 avcodec_find_encoder() /*** 查找具有匹配编解码器ID的已注册编码器.** param id AVCodecID of the requested encoder* return An encoder if one was found, NULL otherwise.*/ const A…