xiaolin coding 图解 MySQL笔记——锁篇

news2024/12/27 10:37:31

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通常会选择一个或多个事务作为牺牲品,通过回滚这些事务来打破死锁循环,释放资源,以便其他事务可以继续执行。

  • 预防和避免:在设计事务和数据库应用时,可以通过采取一些策略来预防或避免死锁的发生,例如:

    • 确保所有事务以相同的顺序请求资源。
    • 限制事务持有资源的时间。
    • 使用超时机制,当事务等待资源超过一定时间后自动放弃。

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

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

相关文章

面向初学者的 Ansys Mechanical 中的接触建模

接触概述 Ansys Mechanical 中的接触建模是仿真结构不同部分在各种条件下如何相互作用的关键方面。它涉及定义表面的接触方式,即它们是接触、滑动还是分离。Ansys Mechanical 提供了广泛的接触选项来准确建模这些交互,包括粘合、摩擦和无分离接触。每个…

【C++指南】C++内存管理 深度解析

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《C指南》 期待您的关注 目录 引言 一、C 内存管理概述 二、C内存区域划分 三、C 内存管理方式 🍃1.自动内存管理…

聚类算法全面解析:理论与实践结合

聚类(Clustering)是数据挖掘和机器学习中一类重要的无监督学习方法,旨在将数据划分为多个类别,使得类别内部的数据相似度高,而类别之间的数据差异较大。聚类广泛应用于图像分割、市场分析、生物信息学、文本挖掘等领域…

Python 批量剪辑视频片头片尾工具

Python 批量剪辑视频片头片尾工具 1.简介: 批量剪辑片头片尾的软件,让你的视频创作事半功倍,视频剪辑处理完成后,用户可以在指定文件夹中查看已经剪切完片头片尾的视频‌。这些工具不仅适用于个人用户进行日常的视频编辑工作&am…

大模型分类1—按应用类型

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl根据应用领域,大模型可分为自然语言处理、计算机视觉和多模态大模型。 1. 自然语言处理大模型(NLP) 1.1 应用领域与技术架构 自然语言处理大模型(NLP)的应用领域广泛,包括但不限于文本分类、…

保姆级教程用vite创建vue3项目并初始化添加PrimeVue UI踩坑实录

文章目录 一、什么是PrimeVue二、详细教程1.添加PrimeVue2.配置main.js3.添加自动引入4.配置vite.config.js5.创建测试页面 一、什么是PrimeVue PrimeVue 是一个用于 Vue.js 3.x 开发的一款高质量、广受欢迎的 Web UI 组件库。 官网地址:https://primevue.org/ 二、…

Go的Gin比java的Springboot更加的开箱即用?

前言 隔壁组的云计算零零后女同事,后文简称 云女士 ,非说 Go 的 Gin 框架比 Springboot 更加的开箱即用,我心想在 Java 里面 Springboot 已经打遍天下无敌手,这份底蕴岂是 Gin 能比。 但是云女士突出一个执拗,非我要…

php 系统函数 记录

PHP intval() 函数 PHP函数介绍—array_key_exists(): 检查数组中是否存在特定键名 如何使用PHP中的parse_url函数解析URL PHP is_array()函数详解,PHP判断是否为数组 PHP函数介绍:in_array()函数 strpos定义和用法 strpos() 函数查找字符串在另一字符串…

关于Chrome自动同步书签的解决办法

前言 并不一定适用所有用户, 目前我在网上搜集了一些资料,也做了一些尝试。 就我个人总结的经验来讲,分享大家以下几种办法: 1.书签同步插件 点击如下🔗: Chrome书签同步https://bm.famend.cn/ …

matrixzq:基于ℤq的纯python矩阵库

1. 引言 当希望使用纯 Python 代码对整数 q 模矩阵进行操作,以演示使用学习误差 (Learning-With-Errors,LWE) 的基于格的加密方案的一些原理时,找到了 Thom Ives 编写的优秀代码“纯 Python 中无需 Numpy 或 Scipy 的 BASIC 线性代数工具”&…

深度学习笔记——模型压缩和优化技术(蒸馏、剪枝、量化)

本文详细介绍模型训练完成后的压缩和优化技术:蒸馏、剪枝、量化。 文章目录 1. 知识蒸馏 (Knowledge Distillation)基本概念工作流程关键技术类型应用场景优势与挑战优势挑战 总结 2. 权重剪枝 (Model Pruning)基本原理二分类1. 非结构化剪枝(Unstructur…

【单片机】ESP32-S3+多TMC2209控制步进电机系列1 UART通信及无传感回零 硬件部分

目录 1. 硬件选型1.1 esp32硬件型号1.2 TMC2209 硬件型号 2 原理接线图2.1 esp32接线2.2 TMC2209接线2.2.1 单向通讯 不配置地址2.2.2 单向通讯 配置地址2.2.3 双向通讯 单UART 【本文采用】2.2.4 双向通讯 多UART 3. 成品效果 1. 硬件选型 1.1 esp32硬件型号 采用的是微雪ES…

【论文复刻】雾霾污染及ZF治理与经济高质量发展(2004-2020年)

一、数据来源: PM2.5数据根据美国哥伦比亚大学社会经济数据与应用中心提供的全球PM2.5的年均浓度数据整理计算而得,人均实际GDP是以2000年为基期进行平减处理获得的实际GDP,控制变量来自《中国城市统计年鉴》、国家统计局,内含原…

行列式计算方法

行列式(Determinant)是线性代数中一个重要的概念,用来描述方阵的一些性质,尤其是与矩阵的可逆性、特征值等有关。下面是几种常见的计算行列式的方法: 1. 2x2矩阵的行列式 对于一个2x2矩阵: 行列式计算公式…

Elastic Cloud Serverless:深入探讨大规模自动扩展和性能压力测试

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

基于SpringBoot的旅游管理系统设计与实现

标题: 《基于SpringBoot的旅游管理系统设计与实现》 摘要: 本研究的主要目标是设计与实现基于Spring Boot的现代化旅游管理系统,旨在有效解决传统系统存在的多项问题,如用户体验不佳、功能不完善以及安全性方面的隐患。随着互联网…

LeetCode 热题100(十五)【动态规划】(3)

15.7最长递增子序列(中等) 题目描述:leetcode链接 300. 最长递增子序列 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元…

精华帖分享|书中自有黄金屋系列2——格雷厄姆估值因子

本文来源于量化小论坛股票量化板块精华帖,作者为Benlyn,发布于2024年2月2日。 以下为精华帖正文: 01 前言 巴菲特一直强调“以合理的估值买入好公司”的投资理念,因此今天想给大家介绍一下与估值相关的内容。买股票买好公司固然…

干部谈话考察系统如何实现灵活定制和精准考评?

在当今社会,干部选拔与任用已成为各类组织内部管理的关键环节。为了确保选拔出的干部具备高素质和卓越能力,干部谈话考察系统应运而生。这一系统以其灵活定制和精准考评的特点,为组织提供了科学、高效的干部考察手段。 干部谈话考察系统通过集…

云渲染特效广告一秒费用预估是多少?

在计算云渲染特效广告每秒钟的费用时,我们需要综合考虑多个关键因素,包括特效的复杂性、所需的渲染计算能力以及对渲染质量的具体要求。通常情况下,影视特效级别的广告因其场景极其复杂,每帧渲染所需时间较长,从而导致…