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…...
node.js实现分页和jwt鉴权机制
const express require(express); const jwt require(jsonwebtoken); const app express(); // 模拟数据库 const db { users: [ { id: 1, username: user1, email: user1example.com }, // ...更多用户 ], // ...其他数据模型 }; // 应用中间件 app.use(express.json…...
Issue id: AppLinkUrlError 应用intent-filter 配置深链接 URL 问题分析 | AndroidManifest
AndroidManifest.xml 配置文件中,对 activity 组件进行声明的时候,独立应用在 IDE 显示 intent-filter 报错,但不影响实际编译,因为是系统应用,肯定会有此 URL 的存在。 AOSP 源码: <activity android:…...
STM32F103 PWM配置
在《STM32F103定时器配置》中我们介绍了PWM的产生原理,本节介绍介绍如何编码实现PWM的输出。 一、PWM相关寄存器 TIMx如果要产生PWM,除了我们上一节提到的如下寄存器: 控制寄存器(TIMx_CR1);DMA/中断使能寄存器(TIMx_DIER)&#x…...
C语言蓝桥杯进阶
系列文章目录 文章目录 系列文章目录前言一、题目1、在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm 841mm,将 A0 纸沿长边对折后为 A1 纸,大小为 841mm 594mm,在对折的过程中长度直接取下整(实际裁剪时可能有损耗)…...
【笔记2-2】ESP32:开发板与espidf插件的一些配置项
主要参考b站宸芯IOT老师的视频,记录自己的笔记,老师讲的主要是linux环境,但配置过程实在太多问题,就直接用windows环境了,老师也有讲一些windows的操作,只要代码会写,操作都还好,开发…...
【Linux】线程概念 | 线程控制
文章目录 👉知识补充👈👉Linux线程概念👈什么是线程Makefile线程 VS 进程线程的优点线程的缺点线程异常线程用途 👉线程控制👈线程终止pthread_exit 函数pthread_cancel 函数线程 ID 的深入理解在多线程的场…...
OCR的评价指标和常用数据集
1.OCR任务简介 OCR(Optical Character Recognition,光学字符识别)是指对包含文本内容的图像或者视频进行处理识别,并提取其中所包含的文字及排版信息的过程。例如,一个常见的应用是将包含文档图像的不可编辑状态的 PDF 文档通过 OCR 技术识别后…...
React性能优化
三个可以优化的地方 避免过度多次渲染 组件会在以下情况下重新渲染 注意:例如组件组合的形式,<Test><Counter></Counter></Test>,即使Test发生了重新渲染,Counter也不会重新渲染。另外使用React这样的库或框架时&a…...
Django之ORM
1.ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对…...
macos上设置windsurf命令行启动
解决方案 1. 在/usr/local/bin 目录下创建软链 sudo ln -s /Applications/Windsurf.app/Contents/Resources/app/bin/windsurf /usr/local/bin/windsurf 2. 执行source source ~/.zshrc...
一、web基础和http协议
前言 https://www.baidu.com/:URL(是一种万维网寻址网址) https://:协议,加密的http,加密的超文本传输协议,在数据传输之前要通过整数进行身份验证,验证通过才可以进行数据传输。 …...
Can‘t find variable: token(token is not defined)
文章目录 例子 1:使用 var例子 2:使用 let 或 const例子 3:异步操作你的代码中的情况 Cant find variable: tokentoken is not defined源代码 // index.jsPage({data: {products:[],cardLayout: grid, // 默认卡片布局为网格模式isGrid: tr…...
Elasticsearch ILM 故障排除:常见问题及修复
作者:来自 Elastic Stef Nestor 大家好!我们的 Elasticsearch 团队正在不断改进我们的索引生命周期管理 (index Lifecycle Management - ILM) 功能。当我第一次加入 Elastic Support 时,我通过我们的使用 ILM 实现自动滚动教程快速上手。在帮…...
1. 设计模式的由来
设计模式的灵感来自建筑师亚历山大的“设计套路”,后来被程序员借用,总结出一套“编程武功秘籍”。 20世纪90年代,四位软件工程师(被称为“四人帮”)——Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides&…...
【Excel】Excel中将日期格式转换为文本格式,并按日期显示。
【问题需求】 在使用excel进行数据导入的过程中, 有的软件要求日期列必须是文本格式。 但是直接将日期列的格式改为文本后,显示一串数字,而不按日期显示。 进而无法导入使用。 【解决方法】 使用【TXET】函数公式进行处理, 在单独…...
SpringBoot入门:如何新建SpringBoot项目(保姆级教程)
在本文中,我们将演示如何新建一个基本的 Spring Boot 项目。写这篇文章的时候我还是很惊讶的,因为我发现有些java的初学者,甚至工作10年的老员工居然并不会新建一个SpringBoot项目,所以特别出了一篇文章来教大家新建一个SpringBoo…...
什么是Layer Normalization?
一、概念 前面的文章中,我们介绍了Batch Normalization。BN的目的是使得每个batch的输入数据在每个维度上的均值为0、方差为1(batch内,数据维度A的所有数值均值为0、方差为1,维度B、C等以此类推),这是由于神…...
基于神经网络的弹弹堂类游戏弹道快速预测
目录 一、 目的... 1 1.1 输入与输出.... 1 1.2 隐网络架构设计.... 1 1.3 激活函数与损失函数.... 1 二、 训练... 2 2.1 数据加载与预处理.... 2 2.2 训练过程.... 2 2.3 训练参数与设置.... 2 三、 测试与分析... 2 3.1 性能对比.... 2 3.2 训练过程差异.... 3 四、…...
ASP.NET CORE API 解决跨域问题
环境 vs2022 .net 8 创建ASP.net Core API项目 配置跨域 编写ApiController 启动项目 得到服务器运行的 地址 在Hbuiler中创建web项目,编写代码 【运行】-【运行到浏览器】-选择一个浏览器,查看结果 正常显示 问题 如果允许所有源访问,有安全风险方…...
西安理工大学丨ChatGPT助力学术论文写作训练营-助力发表SCI一区、二区
在当今学术研究中,科研人员在撰写论文时面临诸多挑战。首先是信息量的剧增,科研人员需要快速消化新知识,筛选相关信息并清晰表达。但论文写作不仅是信息的罗列,还需要条理清晰、逻辑严密、语言精准,特别是在竞争激烈的…...
Android hid 数据传输(device 端 )
最近一直在处理hid 数据需求,简而言之就是两台设备直接可以通过usb 线互相传递数据。 项目架构 为什么Device 端要采用HID(人机接口设备)的方式发送和接收数据呢? 主要是速度快,举个例子,就是鼠标移动&am…...
Facebook 人工智能:重塑社交新未来
在数字化迅速发展的今天,人工智能(AI)已经深入了我们的生活,尤其是在社交媒体领域。Facebook作为全球最大的社交平台之一,正利用AI技术,革新其服务和用户体验,为用户打造社交互动的新未来。 首先,人工智能…...
UIlicious - 自动化端到端测试
在现代软件开发中,测试自动化已然成为产品交付质量的基石。而端到端测试(E2E),作为验证整个应用流畅运行的关键,常常是测试工作中最具挑战性的一环。这时,一款简单高效的自动化测试工具——UIlicious&#…...
PHP 与 MySQL 搭配的优势
一、PHP 与 MySQL 搭配的优势 强大的动态网页开发能力 PHP 是一种服务器端脚本语言,能够生成动态网页内容。它可以根据用户的请求、数据库中的数据等因素,实时地生成 HTML 页面返回给客户端浏览器。而 MySQL 是一个流行的关系型数据库管理系统…...
HDFS 操作命令
在现代的企业环境中,单机容量往往无法存储大量数据,需要跨机器存储。统一管理分布在 集群上的文件系统称为 分布式文件系统 。 HDFS ( Hadoop Distributed File System )是 Apache Hadoop 项目的一个子项目, Hadoo…...
第四篇:k8s 理解Service工作原理
什么是service? Service是将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。 简单来说K8s提供了service对象来访问pod。我们在《k8s网络模型与集群通信》中也说过k8s集群中的每一个Pod(最小调度单位)都有自己的IP地址,都…...
什么是TCP的三次握手?
TCP的三次握手:深入理解建立可靠连接的过程 引言 在计算机网络中,传输控制协议(TCP)是确保数据可靠传输的核心协议之一。TCP通过三次握手机制来建立一个稳定的、双向的连接,这对于确保数据的完整性和顺序至关重要。本…...
Pytorch使用手册- TorchVision目标检测微调Tutorial的使用指南(专题十二)
这篇教程的目标是对一个预训练的 Mask R-CNN 模型进行微调,应用于 Penn-Fudan 行人检测与分割数据集。该数据集包含 170 张图像,里面有 345 个行人实例,我们将通过这个教程来演示如何使用 torchvision 中的新特性,训练一个面向自定义数据集的目标检测和实例分割模型。 注意…...
Modern Effective C++条款三十五:优先考虑基于任务的编程而非基于线程的编程
C中开发者可以通过两种主要方式异步执行一个函数,如doAsyncWork()。这两种方法分别是基于线程(thread-based)和基于任务(task-based)的方式。 基于线程的方式 使用std::thread创建一个新的线程来执行doAsyncWork()函数,直接且直观,但也有其…...
lyapunov指数的绘制
有如下方程: %% 方程式 % x(n1)1y(n)-a*x(n)^2 % y(n1)b*x(n)绘制其对应的lyapunov指数。 MATLAB实现方式: clc; clearvars; close all;%% 方程式 % x(n1)1y(n)-a*x(n)^2 % y(n1)b*x(n)%% 代码 N 1000; a (0:0.001:1.4); b 0.3; na length(a…...
WPF+MVVM案例实战与特效(三十二)- 封装一个Appconfig 操作类(保留注释)
文章目录 1、概述2、ConfigHelper 的功能3、代码实现1、ConfigHelper.cs 代码2、帮助类使用4、总结1、概述 在开发 WPF 应用程序时,配置文件(如 App.config )是存储应用程序设置、连接字符串和其他运行时信息的常用方式。然而,直接操作这些配置文件可能会涉及到复杂的 XML…...
决策树:ID3、C4.5和CART特征选择方式
1 前言 该文章主要目的是记录ID3、C4.5和CART特征选择方式,这里只对决策树进行简单介绍。 决策树(Decision Tree)算法是一种有监督学习算法,它利用分类的思想,根据数据的特征构建数学模型,从而达到数据的筛…...
02 conda常用指令
目录 命令快速查找命令详细解释列出当前conda中存在的解释器环境使用指定的解释器环境创建虚拟环境激活自己创建的虚拟环境虚拟环境删除切换回主环境找到你计算机中安装的miniconda3的跟目录找到虚拟环境的目录选择需要删除的虚拟环境文件夹确认环境是否删除 补充删除虚拟环境指…...
从仪表盘探索 MongoDB 关键指标
这是 MongoDB 监控系列文章的第七篇,前面几篇文章的链接如下: MongoDB 监控(一)MongoDB 监控(二)MongoDB 监控(三)MongoDB 监控(四)MongoDB 监控(…...
Grule前端表单post后端执行grule引擎规则
Grule前端表单post后端执行grule引擎规则 编写前端表单和后端接口 编写test.go执行grule引擎规则 示例都是 go test 执行的测试代码,所以将里面的测试代码去除 由于之前 NumberExponentExample_test.go 已经验证可运行, 所以将 err 的异常处理去除 package mai…...
EasyRTC支持嵌入式智能硬件与微信小程序实时通话
基础建设如此发达的时代,各种物联网设备都越来越普及,尤其是可穿戴设备和智能家居设备的发展,而在物联网设备中,视频物联网设备又是特别受人关注的设备,因为他们具备有看得见的属性,像智能家居里面的摄像头…...
openGauss开源数据库实战十九
文章目录 任务十九 openGauss DML 语句测试任务目标实施步骤一、准备工作二、INSERT语句三、DELETE语句四、UPDATE语句五、清理工作 任务十九 openGauss DML 语句测试 任务目标 掌握DML语句的用法,包括INSERT语句、DELETE语句和UPDATE语句。 实施步骤 一、准备工作 使用Li…...
基于XML的AOP开发
AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程。 AOP相关术语: 目标对象(Target): 你要去代理的对象,可以理解为之前很单纯的那个对象。 代理对象(Proxy): 你把你那个单纯的对象给我,…...
获取Ubuntu-22.04.1 对应的vmlinux文件
0.前言 🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言…...
Python后端 -- 万字长文全面解析Django框架
自从2005年诞生以来,Django因其“开发速度快、安全性高”的特点迅速成为许多开发者的首选。无论是小型的个人项目,还是大型的企业应用,Django都能游刃有余地满足需求。我们将从Django的基础知识带你全面掌握Django,从基础知识到高…...
“指标管理系统”是什么?企业如何搭建指标管理系统?
在当今数字化时代,数据已成为企业决策的重要依据。然而,海量数据中如何筛选出关键指标,并对其进行有效管理,成为了众多企业面临的难题。为此,指标管理系统应运而生,它旨在帮助企业规范化定义、统一管理和高…...
Node.js简单接口实现教程
Node.js简单接口实现教程 1. 准备工作 确保您的计算机已安装: Node.js (建议版本16.x以上)npm (Node包管理器) 2. 项目初始化 # 创建项目目录 mkdir nodejs-api-tutorial cd nodejs-api-tutorial# 初始化npm项目 npm init -y# 安装必要依赖 npm install expres…...
交换机四大镜像(端口镜像、流镜像、VLAN镜像、MAC镜像)应用场景、配置实例及区别对比
在网络管理中,端口镜像、流镜像、VLAN镜像和MAC镜像都是用于监控和分析网络流量的重要技术。 端口镜像(Port Mirroring) 定义:端口镜像是将一个或多个源端口的流量复制到一个目标端口,以便于网络管理员能够监控和分析…...
服务器上的常见Linux命令教程
在管理服务器(如香港服务器)时,掌握常见的 Linux 命令 是非常重要的,它们可以帮助你高效地完成服务器管理任务,如文件操作、进程管理、用户管理、网络配置等。 以下是一个系统化的 Linux 常见命令教程,分为…...
聚合支付系统/官方个人免签系统/三方支付系统稳定安全高并发 附教程
聚合支付系统/官方个人免签系统/三方支付系统稳定安全高并发 附教程 系统采用FastAdmin框架独立全新开发,安全稳定,系统支持代理、商户、码商等业务逻辑。 针对最近一些JD,TB等业务定制,子账号业务逻辑API 非常详细,方便内置…...
【MySQL】使用 JDBC 连接数据库
文章目录 前言1. 认识 JDBC 1.1 概念1.2 好处 2. 使用 JDBC 2.1 安装数据驱动包2.2 把 jar 包导入到项目中2.3 代码编写2.4 测试结果 3. 代码优化4. 源码展示结语 前言 在 MySQL 系列中,我们介绍了很多内容,包括但不限于建库建表,增删查改等…...
深入浅出:PHP会话管理(Session 和 Cookie)
深入浅出:PHP会话管理(Session 和 Cookie) 前言 在Web开发中,会话管理是确保用户状态持续性和数据安全的关键。通过会话管理,我们可以在多个页面请求之间保持用户的登录状态、购物车信息等。PHP提供了两种主要的会话…...
Logistic Regression(逻辑回归)、Maximum Likelihood Estimatio(最大似然估计)
Logistic Regression(逻辑回归)、Maximum Likelihood Estimatio(最大似然估计) 逻辑回归(Logistic Regression,LR)逻辑回归的基本思想逻辑回归模型逻辑回归的目标最大似然估计优化方法 逻辑回归…...
【开源】A063—基于Spring Boot的农产品直卖平台的设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看项目链接获取⬇️,记得注明来意哦~🌹 赠送计算机毕业设计600个选题ex…...