当前位置: 首页 > news >正文

MySQL:数据库中有哪些锁

1、全局锁

加上全局锁后整个数据库就处于只读状态了,这时其他线程执行以下操作,都会被阻塞:

  • 对数据的增删改操作,比如 insert、delete、update等语句;
  • 对表结构的更改操作,比如 alter table、drop table 等语句。

全局锁的使用场景

  1. 逻辑备份:全局锁的典型使用场景是进行全库逻辑备份,例如使用 mysqldump 工具。在备份期间,整个库处于只读状态,确保备份的数据是一致的。
  2. 主从切换:在重新配置主从复制时,可以使用全局锁来确保不会有其他线程对数据库进行更新,从而保持数据一致性。

可以看出再加上全局锁后数据库的除查询外的其他所有业务都被阻塞住了,性能一定很低下。我们可以再可重复读的隔离级别下进行数据备份,备份的数据都是再开启事务那一刻的数据,就不要开启全局锁来控制并发操作,防止破坏数据库一致性了。

2、表锁

  2.1表锁

  • 表锁是一种粗粒度的锁,它会锁定整个表,除了会限制别的线程的读写外,也会限制本线程接下来的读写操作。
  • 表锁适用于特定的场景,但通常不推荐使用,因为它会影响并发性能。

 2.2意向锁

  • 意向锁是一种表级锁,用于指示其他事务是否已经持有了行级锁或表级锁。
  • 意向锁不会阻塞其他事务,只是作为一种标记。
  • 什么时候加意向锁:
    • 在获取行级锁之前,在获取表级锁之前都需要先加上意向锁。

    • 意向锁的存在表示其他事务可能已经在该表上加了表锁/行级锁,因此事务在获取表级锁/行锁之前需要先检查意向锁。
  • 意向锁的目的是为了快速判断表里是否有记录被加锁

2.3 元数据锁(MDL)

这个锁其实是为了防止再操作数据库表中数据时,表的结构发生了改变。

  • 对一张表进行 CRUD 操作时,加的是 MDL 读锁
  • 对一张表做结构变更操作的时候,加的是 MDL 写锁
  • 读锁和读锁不互斥,读写锁互斥。再MDL锁等待队列中,写锁优先级高于读锁。

MDL 是在事务提交后才会释放,这意味着事务执行期间,MDL 是一直持有的。

 2.4 AUTO-INC 锁

  • AUTO-INC 锁是特殊的表锁机制,锁不是再一个事务提交后才释放,而是再执行完插入语句后就会立即释放

  • 在插入数据时,会加一个表级别的 AUTO-INC 锁,然后为被 AUTO_INCREMENT 修饰的字段赋值递增的值,等插入语句执行完成后,才会把 AUTO-INC 锁释放掉。

  • nnoDB 存储引擎提供了个 innodb_autoinc_lock_mode 的系统变量,是用来控制选择用 AUTO-INC 锁,还是轻量级的锁。

  • 当 innodb_autoinc_lock_mode = 0,就采用 AUTO-INC 锁,语句执行结束后才释放锁;
  • 当 innodb_autoinc_lock_mode = 2,就采用轻量级锁,申请自增主键后就释放锁,并不需要等语句执行后才释放。
  • 当 innodb_autoinc_lock_mode = 1:
    • 普通 insert 语句,自增锁在申请之后就马上释放;
    • 类似 insert … select 这样的批量插入数据的语句,自增锁还是要等语句结束后才被释放;

3、行锁

 3.1 记录锁(Record Lock)

        这个锁,锁的是一条记录,有S锁(共享锁)和X锁(排它锁)之分。其中SS不互斥,SX互斥、XX互斥。普通的select查询语句不会加锁。他是通过MVCC进行快照读。像快照读才会进行加锁,具体加的是S锁还是X锁要看执行的语句。

SELECT ... LOCK IN SHARE MODE;                加共享锁

SELECT ... FOR UPDATE;                                加互斥锁

select * from t_test where id = 1 for update;   给id为1的记录加上互斥锁,待事务结束释放锁

  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 插入意向锁

        一个事务在插入一条记录的时候,需要判断插入位置是否已被其他事务加了间隙锁(next-key lock 也包含间隙锁)。

        如果有的话,插入操作就会发生阻塞,直到拥有间隙锁的那个事务提交为止(释放间隙锁的时刻),在此期间会生成一个插入意向锁,表明有事务想在某个区间插入新记录,但是现在处于等待状态。

        当事务 A 还没提交的时候,事务 B 向该表插入一条 id = 4 的新记录,这时会判断到插入的位置已经被事务 A 加了间隙锁,于是事物 B 会生成一个插入意向锁,然后将锁的状态设置为等待状态。此时事务 B 就会发生阻塞,直到事务 A 提交了事务。

插入意向锁名字虽然有意向锁,但是它并不是意向锁,它是一种特殊的间隙锁,属于行级别锁

如果说间隙锁锁住的是一个区间,那么「插入意向锁」锁住的就是一个点。因而从这个角度来说,插入意向锁确实是一种特殊的间隙锁。

PS:MySQL 加锁时,是先生成锁结构,然后设置锁的状态,如果锁状态是等待状态,并不是意味着事务成功获取到了锁,只有当锁状态为正常状态时,才代表事务成功获取到了锁。

相关文章:

MySQL:数据库中有哪些锁

1、全局锁 加上全局锁后整个数据库就处于只读状态了,这时其他线程执行以下操作,都会被阻塞: 对数据的增删改操作,比如 insert、delete、update等语句;对表结构的更改操作,比如 alter table、drop table 等…...

MWC 2024丨美格智能发布全新5G-A模组及FWA解决方案,将5.5G带入现实

2月26日,在MWC 2024世界移动通信大会上,美格智能正式宣布推出5G-A模组SRM817WE以及全新的5G-A FWA解决方案,包含5G-A CPE解决方案SRT858M、5G-A MiFi解决方案SRT878H和5G-A ODU解决方案SRT853MX,旨在进一步提升网络性能&#xff0…...

Opencv双目校正函数 stereoRectify 详解

目录 函数的[官方解释](https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html#ga617b1685d4059c6040827800e72ad2b6)函数原型参数说明:输入参数:输出参数: 函数代码测试 函数的官方解释 函数原型 void cv::stereoRectify ( InputArr…...

实现前端开发几个常用技巧

如何知道iframe下载完成 定时器轮询监听readyState的状态,如果是 complete 或者 interactive 说明文件加载完成。 常用的全屏居中 JS 函数 JS实现deepCopy 生成星级评分 JS数组扁平化之简单方法实现 toString 优点:简单,方便,对…...

Vue3 在SCSS中使用v-bind

template 先创建一个通用的页面结构 <template><div class"v-bubble-bg"></div> </template>js 在JS中先对需要用的数据进行定义&#xff1a; 可以是参数&#xff0c;也可以是data <script setup>const props defineProps({bgCol…...

玩转地下管网三维建模:MagicPipe3D系统

地下管网是保障城市运行的基础设施和“生命线”。随着实景三维中国建设的推进&#xff0c;构建地下管网三维模型与地上融合的数字孪生场景&#xff0c;对于提升智慧城市管理至关重要&#xff01;针对现有三维管线建模数据差异大、建模交互弱、模型效果差、缺乏语义信息等缺陷&a…...

11.以太网交换机工作原理

目录 一、以太网协议二、以太网交换机原理三、交换机常见问题思考四、同网段数据通信全过程五、跨网段数据通信全过程六、关键知识七、调试命令 前言&#xff1a;在网络中传输数据时需要遵循一些标准&#xff0c;以太网协议定义了数据帧在以太网上的传输标准&#xff0c;了解以…...

【通信基础知识】完整通信系统的流程图及各模块功能详解

2024.2.29 抱歉最近在写毕设大论文&#xff0c;因此没有太多时间更新。然而&#xff0c;在写论文的过程中&#xff0c;发现自己对通信系统的了解还不够全明白&#xff0c;因此差了一些硕博论文总结了一个完整的通信系统流程图。若有不对的地方请多多指正//部分内容有参考ChatGP…...

k8s-项目测试环境部署

部署规划 概述 项目开发好后&#xff0c;我们需要部署&#xff0c;我们接下来就基于 阿里云云效 阿里云容器镜像服务 k8s 搭建部署环境 阿里云云效 : 放代码&#xff0c;可以做cicd&#xff08;https://www.aliyun.com/product/yunxiao&#xff09; 阿里云容器镜像服务 :…...

【Elasticsearch管理】缓存机制

文章目录 缓存Field data cache&#xff08;字段数据缓存&#xff09;Node query cache&#xff08;节点查询缓存&#xff09;Indexing buffer&#xff08;索引缓冲区&#xff09;Shard request cache&#xff08;分片请求缓存&#xff09;缓存失败启用/禁用缓存根据请求启用/禁…...

JS api基础初学

轮播图随机版 需求&#xff1a;当我们刷新页面&#xff0c;页面中的轮播图会显示不同图片以及样式 分析&#xff1a;①&#xff1a;准备一个数组对象&#xff0c;里面包含详细信息&#xff08;素材包含&#xff09; ②&#xff1a;随机选择一个数字&#xff0c;选出数组对应…...

uniapp实战:父子组件传参之子组件数量动态变化

需求说明 现有的设置单元列表,每个带有虚线加号的可以看做是一组设置单元,点击加号可以添加一组设置单元.点击设置单元右上角可以删除对应的设置单元. 实现思路说明 利用数组元素添加或是删除的方式实现页面数量动态变化.由于每个设置单元内容都相同所以单独封装了一个子组件.…...

Ubuntu绑定USB接口到固定端口

绑定端口 打开终端&#xff0c;输入以下命令查看USB端口信息&#xff1a; udevadm info -a -n /dev/ttyUSB0执行后&#xff0c;可以看到部分输出如下: 找到第一个&#xff0c;a-b:c格式的KERNELS&#xff0c;记住这个值&#xff0c;后面会用到。 linlin-B660M-D2H-DDR4:~$ u…...

解决gogs勾选“使用选定的文件和模板初始化仓库”报错500,gogs邮件发送失败,gogs邮件配置不生效,gogs自定义模板等问题

解决gogs勾选“使用选定的文件和模板初始化仓库”报错500,gogs邮件发送失败,gogs邮件配置不生效,gogs自定义模板等问题 前几天出了教程本地部署gogs&#xff0c;在后期运行时发现两个问题&#xff1a; 第一&#xff1a;邮件明明配置了&#xff0c;后台显示未配置&#xff0c;…...

数字后端——DEF文件格式

文章目录 MACRO的不同orientationDEF中在macro orientation定义前需要留空格 MACRO的不同orientation DEF中在macro orientation定义前需要留空格 像下图中这种方向和分号之间没有空格的情况&#xff0c;就是有问题的格式。...

【可做课设、附完整技术文档】流式、异步、实时的Django聊天室!(需进一步定制可联系本人)

介绍 完整源码以及完整项目文档请看源码链接。 此Django项目实现了一个精致易扩展的实时聊天室&#xff0c;可直接作为网页开发的课程设计提交&#xff0c;也可二次开发&#xff0c;比如添加更好看的样式&#xff0c;或者更多更酷炫的功能。 实现了如下功能&#xff1a; 流…...

网络编程:基于TCP和UDP的服务器、客户端

1.基于TCP通信服务器 程序代码&#xff1a; 1 #include<myhead.h>2 #define SER_IP "192.168.126.121"//服务器IP3 #define SER_PORT 8888//服务器端口号4 int main(int argc, const char *argv[])5 {6 //1.创建用于监听的套接字7 int sfd-1;8 sf…...

kubectl 命令行管理K8S(上)

目录 陈述式资源管理方式 介绍 命令 项目的生命周期 创建 kubectl create命令 发布 kubectl expose命令 更新 kubectl set 回滚 kubectl rollout 删除 kubectl delete 应用发布策略 金丝雀发布 陈述式资源管理方式 介绍 1.kubernetes 集群管理集群资源…...

Redis 之四:Redis 事务和乐观锁

事务特点 Redis 事务可以一次执行多个命令&#xff0c; 并且带有以下三个重要的保证&#xff1a; 批量操作在发送 EXEC 命令前被放入队列缓存。 收到 EXEC 命令后进入事务执行&#xff0c;事务中任意命令执行失败&#xff0c;其余的命令依然被执行。不具备原子性。 在事务执…...

C# WPF编程-创建项目

1.创建新项目 选择“WPF应用程序”》“下一步” 设置项目 设置项目名称&#xff0c;保存位置等参数>下一步 3.选择框架 4.项目创建成功 5.运行项目...

测试报告革命:用数据讲故事的艺术

在软件测试领域&#xff0c;一份标准的测试报告往往呈现为冰冷数据的堆砌&#xff1a;缺陷总数、严重等级分布、测试用例通过率、自动化覆盖率……这些数字精确地度量了测试活动&#xff0c;却常常在向产品经理、技术总监或业务方汇报时&#xff0c;遭遇尴尬的沉默。当汇报者逐…...

MogFace-large商业应用探索:零售客流量统计中的人脸检测方案

MogFace-large商业应用探索&#xff1a;零售客流量统计中的人脸检测方案 1. 零售行业的人脸检测需求 1.1 传统客流统计的痛点 零售行业一直面临着客流统计的挑战。传统方法如红外感应、闸机计数等存在明显局限&#xff1a; 精度不足&#xff1a;无法区分员工与顾客&#xf…...

OpenLayers进阶指南——动态军事箭头标绘与交互优化

1. 动态军事箭头标绘的核心原理 军事态势图的动态标绘一直是GIS开发中的难点&#xff0c;尤其是箭头这种带有方向性和战术意义的符号。在OpenLayers中实现这个功能&#xff0c;本质上是在处理三个关键问题&#xff1a;坐标计算、图形渲染和交互响应。 先说坐标计算。军事箭头不…...

RabbitMQ 高可用:如何创建镜像队列?镜像队列原理+完整创建流程+实战配置

RabbitMQ 高可用&#xff1a;如何创建镜像队列&#xff1f;镜像队列原理完整创建流程实战配置前言一、镜像队列基础认知&#xff1a;什么是镜像队列&#xff1f;1.1 核心定义1.2 核心架构&#xff08;主从模型&#xff09;1.3 镜像队列核心作用二、镜像队列核心概念2.1 Master&…...

一文搞懂:开发环境配置进化史——从Maven到Nacos再到Docker

&#x1f4cc; 写在前面每个程序员的成长路上&#xff0c;都有一段“配环境3小时&#xff0c;开发30分钟”的血泪史。我还记得第一次搭Java环境&#xff1a;下载JDK、配置PATH、折腾IDE、安装MySQL、改配置文件、启动报错、查半天发现端口被占用……好不容易跑起来了&#xff0…...

torch-npu安装指南:从版本匹配到依赖解决

1. 为什么需要关注torch-npu的版本匹配 第一次接触torch-npu的开发者经常会遇到这样的困惑&#xff1a;明明按照官方文档一步步操作&#xff0c;为什么还是会出现各种奇怪的报错&#xff1f;这个问题我深有体会&#xff0c;去年在给团队部署AI训练环境时&#xff0c;就因为版本…...

【自动驾驶】从轨迹抖动到安全指标:解码核心术语背后的工程逻辑

1. 轨迹抖动&#xff1a;自动驾驶的第一道安全防线 当一辆自动驾驶汽车以60公里时速行驶时&#xff0c;它的决策系统每0.1秒就要生成一条未来5-10秒的预测轨迹。这个被称为Trajectory的动态路径规划&#xff0c;本质上是一连串带有时间戳的坐标点集合。但实际路测中工程师们发现…...

Triton实战手册---Python后端与配置精解(二)

1. Python后端开发实战 Python后端是Triton中最灵活的后端类型&#xff0c;特别适合需要自定义预处理/后处理逻辑的场景。与TensorRT、ONNX等静态模型不同&#xff0c;Python后端允许开发者完全控制推理流程。 先看一个典型的图像处理案例。假设我们需要实现一个图像分类服务&a…...

CREST终极指南:3分钟掌握分子构象搜索与化学空间探索

CREST终极指南&#xff1a;3分钟掌握分子构象搜索与化学空间探索 【免费下载链接】crest CREST - A program for the automated exploration of low-energy molecular chemical space. 项目地址: https://gitcode.com/gh_mirrors/crest/crest 你是否曾经为寻找分子的最佳…...

如何快速掌握游戏化编程学习:CodeCombat新手完整入门指南

如何快速掌握游戏化编程学习&#xff1a;CodeCombat新手完整入门指南 【免费下载链接】codecombat Game for learning how to code. 项目地址: https://gitcode.com/gh_mirrors/co/codecombat CodeCombat是一款创新的游戏化编程学习平台&#xff0c;将编程教育与角色扮演…...