xiaolin coding 图解 MySQL笔记——锁篇
1. 全局锁是怎么用的?
flush tables with read lock
执行以后,整个数据库就处于只读状态了,这时其他线程执行对数据的增删改操作(insert、delete、update);对表结构的更改操作(alter table、drop table)都会被阻塞。
unlock tables
释放全局锁,会话断开全局锁会被自动释放。
2. 全局锁应用场景是什么?
全局锁主要用于做全库逻辑备份,这样在备份数据库期间不会出现备份文件数据和预期的不一样。
3. 加全局锁会带来什么缺点?
加全局锁意味着整个数据库都是只读状态,业务不能更新数据,造成业务停滞。
4. 备份数据库数据的时候,使用全局锁会影响业务,那有什么方式可以避免?
如果数据库的引擎支持的事务可重复读的隔离级别,那么在备份数据库之前先开启事务,这样即使其他的事务更新了表数据,也不会影响备份数据库时的 Read View。因此,对于 InnoDB 存储引擎,在使用备份数据库的工具 mysqldump 时加上 -single-transaction
参数,就会在备份数据库前先开启事务。而对于 MyISAM 这种不支持事务的引擎,在备份数据库时就要使用全局锁。
5. MySQL 表级锁有哪些?
MySQL 里面表级别的锁有这几种:
- 表锁
- 元数据锁(MDL)
- 意向锁;
- AUTO-INC 锁
6. 表锁
如果想对学生表(t_student)加表锁,可以使用
lock tables t_student read; 表级别读锁(共享锁),阻止其他会话写操作
lock tables t_student write; 表级别写锁(独占锁),阻止其他会话读写操作
表锁除了限制别的线程的读写,也会限制本线程的读写,同时还会限制本线程访问其他表。
InnoDB 实现了颗粒度更细的行级锁,比颗粒度太大的表锁好。
7. 元数据锁
不需要显式使用元数据锁(MDL),当对一张表进行 CRUD 操作时,会自动加上 MDL 读锁,对一张表做结构变更操作的时候,会自动加上 MDL 写锁。
8. MDL 不需要显式调用,那是在什么时候释放的?
MDL 是在事务提交后才会释放,这意味着事务执行期间,MDL 是一直持有的。
那么如果有一个长事务,比如 A 启用了事务但是一直不提交,然后执行了一条 select 语句,这时候加上了 MDL 读锁,然后 B 也执行了 select,此时并不会冲突(因为读),接着 C 修改了表字段,由于 A 一直没有提交,读锁被占用,C 就无法申请到写锁,被阻塞,C 阻塞后,后续有对该表的 select 语句都会被阻塞。因为申请 MDL 锁的操作会形成一个队列,队列中写锁获取优先级高于读锁,所以一旦出现写锁等待,会阻塞后续该表的所有 CRUD 操作。
所以在对表结构变更前,先看看数据库中的长事务是否已经对表加上了读锁,可以考虑 kill 掉这个长事务。
9. 意向锁
在 InnoDB 引擎的表里对某些记录加上共享锁之前,需要先在表级别加上意向共享锁;对某些记录加上独占锁之前,需要先在表级别加上一个意向独占锁。
意向共享锁和意向独占锁是表级锁,不会和行级的共享锁和独占锁之间发生冲突,而且意向锁之间也不会发生冲突,只会和共享、独占表锁发生冲突。
因为如果没有意向锁,需要在记录级别找是否存在独占锁,效率慢,有了意向锁就先在表级别找是否存在独占锁,意向锁是为了快速判断表里是否有记录被加锁。
10. AUTO-INC 锁
表里的主键通常都会设置成自增的,这是通过 AUTO_INCREMENT
属性实现的,AUTO-INC 是插入数据时加的表级别的锁,不是在一个事务提交后才释放,而是在执行完插入语句后就会立即释放。
但是,AUTO-INC 锁在对大量数据进行插入的时候,会影响插入性能,因为另一个事务的插入会被阻塞,所以 InnoDB 存储引擎提供一种轻量级的锁来实现自增,一样也是在插入数据的时候,会为被AUTO_INCREMENT
修饰的字段加上轻量级锁,然后给该字段赋值一个自增的值,就把这个轻量级锁释放了,而不需要等待整个插入语句执行完才释放锁。
InnoDB 提供 innodb_autoinc_lock_mode
的系统变量,用来控制选择用 AUTO-INC 锁,还是轻量级锁,为 0 代表采用 AUTO-INC 锁,2 为采用轻量级锁,为 1 是普通 insert 语句自增锁申请后立马释放,批量插入数据语句等语句结束后才释放。
当 innodb_autoinc_lock_mode = 2 时,并且 binlog_format = row,既能提升并发性,又不会出现数据一致性问题。
11. 行级锁
- Record Lock 记录锁
- Gap Lock 间隙锁
- Next-Key Lock 临键锁:Record Lock + Gap Lock 的组合
12. Record Lock
记录锁锁住的是一条记录,而且记录锁是由 S 锁(共享锁)和 X 锁(独占锁)之分的,当 A 事务对某记录加 S 锁,B 也可以对该记录加 S 锁,但不能加 X 锁;A 加 X 锁,B 不能加 S 或 X 锁。
比如 select * from t_test where id = 1 for update;
对 t_test 表中 id 为 1 的行加上了record lock。
13. Gap Lock
间隙锁只存在于可重复隔离级别,目的是为了解决可重复读隔离级别下的幻读。
比如表中有范围 id 为(3,5)间隙锁,那么其他事务就无法插入 id = 4 这条记录了,这样就有效防止了幻读。间隙锁目的是防止插入幻影记录,所以间隙锁之间是兼容的,而且 X和S 型间隙锁没有什么区别
14. Next-Key Lock
临键锁锁定一个范围,并且锁定记录本身,临键锁既能保护该记录,又能阻止其他事务将新纪录插入到间隙中,但是临键锁是包含间隙锁和记录锁的,所以存在记录锁的兼容冲突问题。
15. 插入意向锁
一个事务在插入一条记录的时候,需要判断插入位置是否已被其他事务加了间隙锁,如果有插入操作会发生阻塞,直到拥有间隙锁的事务提交,在此期间会生成一个插入意向锁,表明有事务想在某个区间插入新记录,但是现在处于等待状态。插入意向锁并不是意向锁,是一种特殊的间隙锁,属于行级别锁,间隙锁是一个范围,插入意向锁相当于一个点。
16. 什么是死锁?
死锁发生在两个或多个事务在等待对方释放资源以便自己继续执行,但每个事务又持有对方需要的资源,从而导致所有相关事务都无法继续执行的情况。
死锁的四个必要条件为:
- 互斥条件:资源不能被多个事务同时使用,即一个资源在某一时刻只能由一个事务占用
- 占有并等待条件:事务已经持有至少一个资源,并且在等待获取其他事务持有的资源
- 不可剥夺条件:资源不能被强制从事务中剥夺,事务必须在完成时自愿释放资源
- 循环等待条件:存在一个事务等待环路,其中每个事务都在等待下一个事务所持有的资源
数据库管理系统通常由机制来检测和处理死锁:
-
死锁检测:DBMS会定期检查事务之间的依赖关系,以发现是否存在死锁。
-
死锁解决:一旦检测到死锁,DBMS通常会选择一个或多个事务作为牺牲品,通过回滚这些事务来打破死锁循环,释放资源,以便其他事务可以继续执行。
-
预防和避免:在设计事务和数据库应用时,可以通过采取一些策略来预防或避免死锁的发生,例如:
-
- 确保所有事务以相同的顺序请求资源。
-
- 限制事务持有资源的时间。
-
- 使用超时机制,当事务等待资源超过一定时间后自动放弃。
相关文章:
xiaolin coding 图解 MySQL笔记——锁篇
1. 全局锁是怎么用的? flush tables with read lock 执行以后,整个数据库就处于只读状态了,这时其他线程执行对数据的增删改操作(insert、delete、update);对表结构的更改操作(alter table、dr…...

11-SpringCloud Alibaba-Seata处理分布式事务
一、Seata基本介绍 官网:https://seata.apache.org/zh-cn/ Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 我…...
更换 Git 项目的远程仓库地址(五种方法)
更换 Git 项目的远程仓库地址有几种不同的方法,下面是详细的步骤和一些额外的方法来完成这个任务。 方法1:使用 git remote set-url 这是最直接的方法。假设你想要更改名为 origin 的远程仓库地址到新的 URL。 查看当前的远程仓库配置: git…...

3大模块助力学生会视频自动评审系统升级
一、项目背景 传统的学生会视频作品或电子申请材料评审由老师线下逐一面审完成。面对大量学生提交的作品,评审效率低、耗时长,且主观性较强。为此,客户希望开发一个基于AI的线上自动面审系统,从语法正确性、演讲流利度和发音准确…...

鸿蒙开发——使用ArkTs处理XML文本
1、概 述 XML(可扩展标记语言)是一种用于描述数据的标记语言,旨在提供一种通用的方式来传输和存储数据,特别是Web应用程序中经常使用的数据。XML并不预定义标记。因此,XML更加灵活,并且可以适用于广泛的应…...
【Linux】文件查找 find grep
文章目录 1. 引言简介Linux文件系统的基本概念为什么文件查找命令在日常使用中非常重要 2. find 命令基本用法常见选项和参数高级用法和技巧实际示例 3. locate 命令如何工作与find命令的区别安装和使用locate实际示例 4. grep 结合文件查找使用grep进行内容查找结合find命令使…...
Go学习笔记之运算符号
算数运算符 运算符描述相加-相减*相乘/相除%求余自增–自减 代码示例: package mainimport "fmt"func main() {// 算数运算符a : 1b : 2fmt.Println(a b) // 加 3fmt.Println(a - b) // 减 -1fmt.Println(a * b) // 乘 2fmt.Println(a / b) // 除 0fm…...
npm : 无法加载文件 D:\nodejs\npm.ps1,因为在此系统上禁止运行脚本
要以管理员身份打开PowerShell,请按照以下步骤操作: 在Windows搜索框中查找PowerShell: 在任务栏上,点击左下角的Windows徽标(或按Win S键)以打开搜索框。输入“PowerShell”以查找PowerShell应用程序。右…...
YOLOv8-ultralytics-8.2.103部分代码阅读笔记-torch_utils.py
torch_utils.py ultralytics\utils\torch_utils.py 目录 torch_utils.py 1.所需的库和模块 2.def torch_distributed_zero_first(local_rank: int): 3.def smart_inference_mode(): 4.def autocast(enabled: bool, device: str "cuda"): 5.def get_cpu_i…...
Java中的数据存储结构解析与应用
一、引言 在Java编程中,数据存储结构是程序设计的基础。合理选择和使用数据结构可以提高程序的性能和可维护性。本文将带您了解Java中的各种数据存储结构,并探讨其优缺点及适用场景。 二、基本数据类型 Java提供了8种基本数据类型,分别是b…...

【链表】力扣 141. 环形链表
一、题目 二、思路 龟兔进行赛跑 龟的速度是 1,兔的速度是 2龟兔从同一起点出发,若 龟追上兔 则说明 有环 存在;若追不上,则说明无环。 三、代码 /*** Definition for singly-linked list.* class ListNode {* int val;* …...

Hbase整合Mapreduce案例2 hbase数据下载至hdfs中——wordcount
目录 整合结构准备数据下载pom.xmlMain.javaReduce.javaMap.java操作 总结 整合结构 和案例1的结构差不多,Hbase移动到开头,后面跟随MR程序。 因此对于输入的K1 V1会进行一定的修改 准备 在HBASE中创建表,并写入数据 create "wunaii…...
diff算法
vue的diff算法详解 vue: diff 算法是一种通过同层的树节点进行比较的高效算法 其有两个特点: 比较只会在同层级进行, 不会跨层级比较 在diff比较的过程中,循环从两边向中间比较 diff 算法在很多场景下都有应用,在 vue 中&…...

最新AI问答创作运营系统(SparkAi系统),GPT-4.0/GPT-4o多模态模型+联网搜索提问+问答分析+AI绘画+管理后台系统
目录 一、人工智能 系统介绍文档 二、功能模块介绍 系统快速体验 三、系统功能模块 3.1 AI全模型支持/插件系统 AI大模型 多模态模型文档分析 多模态识图理解能力 联网搜索回复总结 3.2 AI智能体应用 3.2.1 AI智能体/GPTs商店 3.2.2 AI智能体/GPTs工作台 3.2.3 自…...
docker应用
docker version docker info docker images# 查看主机所以镜像 docker search# 搜索镜像 docker pull# 下载镜像 docker rmi# 删除镜像 docker tag 镜像名:版本 新镜像名:版本 # 复制镜像并改名 docker commit # 提交镜像 docker load -i /XXX/XXX.tar # 导入镜像 docker sav…...
COCO数据集理解
COCO(Common Objects in Context)数据集是一个用于计算机视觉研究的广泛使用的数据集,特别是在物体检测、分割和图像标注等任务中。COCO数据集由微软研究院开发,其主要特点包括: 丰富的标签:COCO数据集包含…...
C# 向上取整多种实现方法
1.使用 Math.Ceiling 方法: 在 C# 中,可以利用 System.Math 类下的 Math.Ceiling 方法来实现向上取整。它接受一个 double 或 decimal 类型的参数,并返回大于或等于该参数的最小整数(以 double 或 decimal 类型表示)。…...

Elastic Cloud Serverless:深入探讨大规模自动扩展和性能压力测试
作者:来自 Elastic David Brimley, Jason Bryan, Gareth Ellis 及 Stewart Miles 深入了解 Elasticsearch Cloud Serverless 如何动态扩展以处理海量数据和复杂查询。我们探索其在实际条件下的性能,深入了解其可靠性、效率和可扩展性。 简介 Elastic Cl…...

新一代零样本无训练目标检测
🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年12月2日21点02分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅h…...
es 3期 第13节-多条件组合查询实战运用
#### 1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性ÿ…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...