MySQL——锁

1 全局锁

上锁后,整个数据库处于只读状态

flush tables with read lock

释放: 

unlock tables

应用:用于全库逻辑备份

缺点:如果数据量很大,备份会花很多时间,只能读数据,造成业务停滞

如果引擎支持可重复读的隔离级别,备份之前可以先开启事务,且由于MVCC的支持,备份期间数据库仍然可以更新。 

2 表级锁

2.1 表锁

分为共享锁和独占锁,会互斥

//表级别的共享锁,也就是读锁;
lock tables t_student read;//表级别的独占锁,也就是写锁;
lock tables t_stuent write;

 释放:

unlock tables

尽量避免使用InnoDB中的表锁,因为还有颗粒度更细的行级锁。

2.2 元数据锁 MDL

不需要显示使用MDL,对表操作时,会自动加MDL。

  • CRUD操作,加MDL读锁
  • 对表结构变更,加MDL写锁

MDL是为保证用户执行CRUD操作时,防止其它线程对表结构做变更

MDL在事务执行期间,一直持有,事务提交后释放。

MDL写锁获取优先级高于读锁,当写锁等待,后续所有CRUD操作都会被阻塞。因此,对表结构变更前,要先看看数据库中的长事务是否加了MDL读锁,如果加了读锁,后面所有操作都会被阻塞。可以考虑kill掉这个长事务。

2.3 意向锁

select 可以对记录加共享锁和独占锁,加锁之前,先对表加意向锁。

//先在表上加上意向共享锁,然后对读取的记录加共享锁
select ... lock in share mode;//先表上加上意向独占锁,然后对读取的记录加独占锁
select ... for update;
  • 在使用 InnoDB 引擎的表里对某些记录加上「共享锁」之前,需要先在表级别加上一个「意向共享锁」;
  • 在使用 InnoDB 引擎的表里对某些纪录加上「独占锁」之前,需要先在表级别加上一个「意向独占锁」;

也就是,当执行插入、更新、删除操作,需要先对表加上「意向独占锁」,然后对该记录加独占锁。而普通的 select 是不会加行级锁的,普通的 select 语句是利用 MVCC 实现一致性读,是无锁的。

意向共享锁和意向独占锁是表级锁,不会和行级的共享锁和独占锁发生冲突,而且意向锁之间也不会发生冲突,只会和共享表锁(lock tables ... read)和独占表锁(lock tables ... write)发生冲突。

作用:如果没有意向锁,加独占表锁时,就需要遍历表中所有记录,查看是否有记录存在独占锁。而有意向锁后,在对记录加独占锁之前,会对表加上意向独占锁,和独占表锁互斥。

2.4 AUTO-INC锁

主键字段声明AUTO_INCREMENT属性,可以不指定主键的值,实现自增。这是通过AUTO-INC锁实现的。

AUTO-INC锁是一种特殊的表锁,不再是一个事务提交后释放,而是执行完插入语句后就会释放。

插入数据,会加一个表级AUTO-INC锁,主键自增,其它插入语句会被阻塞,保证字段的值连续递增;插入完毕,锁释放。

但大量数据插入时,会影响性能。因此,InnoDB提供了一种轻量级的锁来实现递增。插入数据时,给主键字段赋值完毕后,锁就释放,不需要等整个插入语句执行完毕。

轻量级锁可能会导致主从数据库不一致的问题。参考小林coding.

3 行级锁

InnoDB 引擎是支持行级锁的,而 MyISAM 引擎并不支持行级锁。

普通的 select 语句是不会对记录加锁的,因为它属于快照读。

如果要在查询时对记录加行锁,如下,这种查询会加锁的语句称为锁定读。对记录加锁前,会对表先加意向锁。

//对读取的记录加共享锁
select ... lock in share mode;//对读取的记录加独占锁
select ... for update;

3.1 Record Lock 

记录锁,分为S锁和X锁。

共享锁(S锁)满足读读共享,读写互斥。独占锁(X锁)满足写写互斥、读写互斥。

3.2 Gap Lock

间隙锁,只存在于可重复读隔离级别,解决幻读现象。

假设,表中有一个范围 id 为(3,5)间隙锁,那么其他事务就无法插入 id = 4 这条记录了,这样就有效的防止幻读现象的发生。

间隙锁虽然存在 X 型间隙锁和 S 型间隙锁,但是并没有什么区别,间隙锁之间是兼容的,即两个事务可以同时持有包含共同间隙范围的间隙锁,并不存在互斥关系,因为间隙锁的目的是防止插入幻影记录而提出的。

3.3 Next-Key Lock

临键锁,Record Lock + Gap Lock,锁定一个范围,并锁定记录本身。

假设,表中有一个范围 id 为(3,5] 的 next-key lock,那么其他事务即不能插入 id = 4 记录,也不能修改 id = 5 这条记录。

next-key lock 是包含间隙锁+记录锁的,如果一个事务获取了 X 型的 next-key lock,那么另外一个事务在获取相同范围的 X 型的 next-key lock 时,是会被阻塞的

3.4 插入意向锁

事务插入一条记录,需要判断插入位置是否被其他事务加了间隙锁。有的话,就会阻塞,直到有间隙锁的事务提交为止,在此期间,会形成一个插入意向锁,表示想插入记录,但处于等待状态(MySQL 加锁时,是先生成锁结构,然后设置锁的状态,如果锁状态是等待状态,并不是意味着事务成功获取到了锁,只有当锁状态为正常状态时,才代表事务成功获取到了锁)。

插入意向锁并不是意向锁,是一种特殊的间隙锁,锁住的是一个点,而不是一个区间。

两个事务不能在同一时间内,一个拥有间隙锁,一个拥有间隙区间内的插入意向锁。

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

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

相关文章

SpringBoot 基础介绍以及相关可实现的功能思路

文章目录 简介start 依赖自定义Banner日志管理devtools统一返回接口接口参数校验自定义异常调用远程接口使用 简介 Spring Boot 是基于Spring的开发开发框架,Spring 的缺点是具有大量的配置文件,使用 SpringBoot 约定大于配置,可以让开发者专…

VMware虚拟机忘记密码操作方法

下面已openEuler虚拟机为例: 1、点击重启时,一直按esc(鼠标点击一下,确保鼠标在你的虚拟机里面) 2、一直到进入到如下页面按e键(可能会略有不同) 3、按e键后跳转到如下页面 4、在该页面输入 in…

高级定时器

本节主要介绍以下内容: 定时器简介 高级定时器功能框图讲解 一、定时器简介 定时器功能 :定时、输出比较、输入捕获、断路输入 定时器分类 :基本定时器、通用定时器、高级定时器 定时器资源 :F103有2个高级定时器、4个通…

c语言-数据类型(下)

目录 4.实型变量 5.字符常量 直接常量: 转义字符: 6.字符变量 7.字符串常量 五、输出格式总结 整型: 浮点型: 字符及字符串: 指针(地址): 六、typedef 七、sizeof一个问…

Python从入门到精通秘籍五

Python速成,每日持续更新,知识点超详细,涵盖所有Python重难点知识及其对应代码,利用碎片化时间,实现Python从入门到精通的飞跃!!! 一、Python的函数基本定义语法 当定义一个函数时,我们使用关键字def,后跟函数名称和一对圆括号。在圆括号内,可以指定任意数量的参数…

Matlab并行编程之GPU

Matlab并行编程之GPU Matlab提供GPU上计算支持: 基础数据类型(gpuArray和对应API),支持GPU计算的内置函数和多个工具包,支持PTX内核对象加载,支持MEX函数使用CUDA C/C开发等。对大规模数据处理,复杂计算,利用GPU计算能提供显著的性能加速效果. Matlab同…

nginx前后端不分离项目代理配置

文章目录 了解举例1:一个项目content-path路径配置为空,使用nginx代理。举例2:配置上项目的content-path,再使用ngxin代理 总结 现在很多时候都是前后端分离的项目,所以配置代理的时候,前端和后端的代理分开…

Docker之网络配置的使用

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《Docker之网络配置的使用》。🎯&…

OpenHarmony——Linux之IR驱动

Linux之IR驱动 背景 在光谱中波长自760nm至400um的电磁波称为红外线,它是一种不可见光。红外遥控成本很低,以前广泛应用在电视,空调等电器的控制上面,现在随着蓝牙遥控器慢慢普及,红外遥控越来越少,但在某…

ELK

ELK 的工作原理: (1)在所有需要收集日志的服务器上部署Logstash;或者先将日志进行集中化管理在日志服务器上,在日志服务器上部署 Logstash。 (2)Logstash 收集日志,将日志格式化并输…

图像处理:孤立点的检测

图像处理-孤立点的检测 孤立点的检测在图像处理中通常涉及到检测图像中的突变或者边缘,而使用二阶导数是一种常见的方法。一阶导数可以帮助找到图像中的边缘,而二阶导数则有助于检测边缘上的峰值,这些峰值可能对应于孤立点或者特殊的图像结构…

AI大模型预先学习笔记二:prompt提问大模型、langchain使用大模型框架、fine tune微调大模型

文章目录 一、Prompt Engineering(怎么去提问大模型)1)环境准备2)交互代码的参数备注3)交互代码 二、LangChain(一个框架去使用大模型)1)LangChain核心介绍:I/O模块、数据…

Spring MVC中@Controller和@RestController的区别

Controller 和 RestController 是 Spring MVC 中用于处理 HTTP 请求的注解,它们有以下区别: 返回值处理方式: Controller 用于定义一个传统的 Spring MVC 控制器,它的方法通常返回视图名称或 ModelAndView 对象,由视图…

TypeError: (0 , _ahooks.createUpdateEffect) is not a function

版本 "next": "14.0.4", "antd-mobile": "^5.34.0", next中使用antd-mobile可困难了.主要是因为antd-mobile不支持ssr 1.下载antd-mobile包,在next.config.js中加入 transpilePackages: [antd-mobile,], 2.在页面中引入antd-mobi…

蓝桥杯备赛day02 -- 算法训练题 拿金币Java

目录 题目: 问题描述 输入格式 输出格式 解题过程 第一步 定义dp数组 第二步 确定 dp 数组递推公式 第三步 dp数组的初始化 第四步 dp数组的遍历顺序 第五步 举例说明 报错:内存超限 用dp数组去存储位置上的金币 dp数组从二维降为一维 收获&a…

【MCAL】MCU模块详解

目录 前言 正文 1. MCU模块介绍 2. MCU依赖的模块 3. MCU模块提供服务 3.1 时钟的初始化 3.2 MCU模式的配置 3.3 MCU软件复位功能 3.4 RAM的初始化 4.MCU重要数据类型 4.1 Mcu_ResetType 4.2 Mcu_ModeType 5. MCU重要API 5.1 Mcu_Init 5.2 Mcu_InitClock 5.3 M…

信息系统安全——Linux 访问控制机制分析

实验 4 Linux 访问控制机制分析 4.1 实验名称 《Linux 访问控制机制分析》 4.2 实验目的 1 、熟悉 Linux基本访问控制机制使用和原理 2 、熟悉 Linux S 位的作用和使用 3 、熟悉强制访问控制 Selinux 原理及其使用 4.3 实验步骤及内容 1 、Linux 基本访问控制机制 &#xff08…

vue el-table 多选框回填

主要代码: //选中列,所有列,表名toggleSelection(selectRows, totalRows, tablename) {this.$refs.table.clearSelection();if (selectRows.length > 0) {this.$nextTick(() > {selectRows.forEach(item > {totalRows.forEach(item1 > {if (…

C语言天花板——指针(经典题目)

指针我们已经学习的差不多了,今天我来给大家分享几个经典的题目,来让我们相互学习🏎️🏎️🏎️ int main() {int a[4] { 1, 2, 3, 4 };int* ptr1 (int*)(&a 1);int* ptr2 (int*)((int)a 1);printf("%x,%…

连锁品牌如何引流获客?小魔推短视频矩阵助你流量爆棚

近几年因为大环境的影响,大多数实体行业的生意都不太好做,为了帮助更多实体行业提升品牌知名度,带来更多的流量与转化,餐赞小魔推也在不断的更新迭代,同时考虑到了单门店与连锁品牌使用的便捷性。 目前针对连锁品牌方&…