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

生产环境MYSQL常见锁表场景

前言

锁表是我们在生产环境十分常见的问题之一,解决问题前需要先了解锁表产生的原因以找到解决方案,并制定方案以预防锁表,本文接下来会分别模拟元数据锁表(MDL锁)行锁升级为表锁死锁、**显示锁表
**四种锁表情形。

准备工作

  • 安装了MYSQL和MYSQL客户端的带可视化界面的终端系统(windows、mac、可视化ubuntu等)。
  • 分别打开三个MYSQL客户端A、B、C(会话C可以替换为navicat等可视化连接工具操作)。
  • 创建测试表
-- 创建测试数据库
CREATE DATABASE IF NOT EXISTS locktest;
USE locktest;-- 创建测试表
CREATE TABLE test_table (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),value INT
);-- 插入一些测试数据
INSERT INTO test_table (name, value) VALUES 
('测试1', 100),
('测试2', 200),
('测试3', 300),
('测试4', 400),
('测试5', 500);

元数据锁表(MDL锁)

说明

当前进程执行DDL语句时需要获取MDL锁,若此时其他进程正在执行事务且包含当前表的操作语句(读或写),则DDL语句会被阻塞,进入等待锁的状态。

模拟流程

  • 会话A执行:
TART TRANSACTION;
SELECT * FROM test_table;
# 暂时不执行COMMIT
  • 会话B执行:
ALTER TABLE test_table ADD COLUMN new_col INT;
  • 此时会话B会被阻塞,会话C(navicat)查看进程情况,执行:
SHOW PROCESSLIST;
  • navicat上查询结果如下:
    等待元数据锁

  • 可以看到ID=24的进程正在等待元数据锁。这时会话A执行提交:

# 会话A提交事务
commit;
  • 会话A提交事务后释放锁,会话B获取锁执行成功。

总结

这种锁表情形,常见于项目新版本上线时,开发人员A需要执行修改表tableA字段的SQL脚本时,此时开发人员B正在启动事务并查询tableA的数据,导致开发人员A的SQL脚本执行阻塞;或者此时线上项目正在执行包含表tableA操作的事务,该事务需要执行很长时间。

解决方案

行锁升级为表锁

说明

对于大数量的表进行查询时,通常会增加索引以提高查询效率。但如果在DML语句执行期间,如果索引使用不当导致索引失效时,行锁可能会升级为表锁(多行锁)。

模拟流程

  • 给测试表增加索引
create index idx_name on test_table(name);
  • 会话A执行:
START TRANSACTION;
UPDATE test_table SET value = 777 WHERE name LIKE '%测试%';
-- 不执行COMMIT
  • 会话B执行:
UPDATE test_table SET value = 888 WHERE name = '测试2';
  • 此处会话B语句阻塞,会话C(navicat)查看进程:
# 会话C执行
SHOW PROCESSLIST;

在这里插入图片描述

  • 长时间等待后,会话B提示等待锁超时:
    在这里插入图片描述
  • 同样会话A执行commit,语句执行成功后恢复正常
# 会话A提交事务
commit;

总结

在InnoDB引擎中,锁是加在索引上的,当修改语句的索引失效时,innoDB会对扫描到的所有索引记录都加锁(多行锁),直到这条查询语句执行结束。在此期间,其他的进程如果需要修改其中一个被扫描到的索引对应的行记录时,就会因为没有得到行级锁而被阻塞。

解决方案

预防索引失效,索引失效常见情况:

死锁

说明

死锁是线上环境的经典问题,死锁形成的本质就是多进程之间形成了资源等待环,并且无法凭借自身能力解锁。

模拟流程

  • 事务A执行:
START TRANSACTION;
UPDATE test_table SET value = 100 WHERE id = 1;
  • 事务B执行:
START TRANSACTION;
UPDATE test_table SET value = 200 WHERE id = 2;
  • 事务A再执行:
UPDATE test_table SET value = 300 WHERE id = 2;
  • 事务B再执行:
UPDATE test_table SET value = 400 WHERE id = 1;
  • 此时其中一个会话会提示死锁,并且innoDB已强制回滚并终止了其中一个事务:
    在这里插入图片描述

总结

解决方案

  • 检查相关事务的逻辑,尽量保证多个事务的获取锁资源顺序是相同的,比如都是先获取A锁,再获取B锁,最后获取C锁。又或者让获取多个锁的流程作为一个原子操作。

显式锁表

说明

手动执行sql语句LOCK TABLE锁表

模拟流程

  • 会话A执行:
LOCK TABLES test_table WRITE;
-- 现在表被锁定,只有会话A可以读写
  • 会话B常识查询或修改表,会被阻塞:
SELECT * FROM test_table;
-- 或
UPDATE test_table SET value = 500 WHERE id = 1;
  • 会话A释放锁,会话B的语句能继续执行:
UNLOCK TABLES;

总结

解决方案

找到手动锁表的会话,进行手动释放锁即可。

常见观察锁表的SQL语句

-- 查看当前进程列表,观察被阻塞的查询
SHOW PROCESSLIST;-- 查看InnoDB事务和锁信息
SHOW ENGINE INNODB STATUS;-- 查看当前事务
SELECT * FROM information_schema.innodb_trx;-- 查看当前锁
SELECT * FROM performance_schema.data_locks;-- 查看锁等待
SELECT * FROM performance_schema.data_lock_waits;

相关文章:

生产环境MYSQL常见锁表场景

前言 锁表是我们在生产环境十分常见的问题之一,解决问题前需要先了解锁表产生的原因以找到解决方案,并制定方案以预防锁表,本文接下来会分别模拟元数据锁表(MDL锁)、行锁升级为表锁、死锁、**显示锁表 **四种锁表情形…...

结构性设计模式之Composite(组合)

结构性设计模式之Composite(组合) 摘要: Composite(组合)模式通过树形结构表示"部分-整体"层次关系,使得用户能够统一处理单个对象和组合对象。该模式包含Component(组件接口&#x…...

Java面试八股--04-MySQL

致谢:感谢整理!2025年 Java 面试八股文(20w字)_java面试八股文-CSDN博客 目录 1、Select语句完整的执行顺序 2、MySQL事务 3、MyISAM和InnoDB的区别 4、悲观锁和乐观锁怎么实现 5、聚簇索引与非聚簇索引区别 6、什么情况下my…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(31):そう

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(31):そう 1、前言(1)情况说明(2)工程师的信仰2、知识点(1)复习(2) そう1,いAくな+さそうでう。2,なAな + そうです。3,いいです ー>よさそうです。4、x Xの状況(じょうきょう)5、みたい & ら…...

设计模式——访问者设计模式(行为型)

摘要 访问者设计模式是一种行为型设计模式,它将数据结构与作用于结构上的操作解耦,允许在不修改数据结构的前提下增加新的操作行为。该模式包含关键角色如元素接口、具体元素类、访问者接口和具体访问者类。通过访问者模式,可以在不改变对象…...

实验设计与分析(第6版,Montgomery著,傅珏生译) 第10章拟合回归模型10.9节思考题10.1 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第10章拟合回归模型10.9节思考题10.1 R语言解题。主要涉及线性回归、回归的显著性、回归系数的置信区间。 vial <- seq(1, 10, 1) Viscosity <- c(160,171,175,182,184,181,188,19…...

《对象创建的秘密:Java 内存布局、逃逸分析与 TLAB 优化详解》

大家好呀&#xff01;今天我们来聊聊Java世界里那些"看不见摸不着"但又超级重要的东西——对象在内存里是怎么"住"的&#xff0c;以及JVM这个"超级管家"是怎么帮我们优化管理的。放心&#xff0c;我会用最接地气的方式讲解&#xff0c;保证连小学…...

LeetCode 高频 SQL 50 题(基础版) 之 【高级查询和连接】· 下

上部分链接&#xff1a;LeetCode 高频 SQL 50 题&#xff08;基础版&#xff09; 之 【高级查询和连接】 上 题目&#xff1a;1164. 指定日期的产品价格 题解&#xff1a; select product_id,10 price from Products group by product_id having min(change_date) > 201…...

Java并发编程:读写锁与普通互斥锁的深度对比

在Java并发编程中&#xff0c;锁是实现线程安全的重要工具。其中&#xff0c;普通互斥锁&#xff08;如synchronized和ReentrantLock&#xff09;和读写锁&#xff08;ReentrantReadWriteLock&#xff09;是两种常用的同步机制。本文将从多个维度深入分析它们的区别、适用场景及…...

Spring Boot Actuator未授权访问漏洞修复

方案1&#xff1a;在网关的配置文件里增加以下配置 management:endpoints:web:exposure:include: []enabled-by-default: falseendpoint:health:show-details: ALWAYS 方案二&#xff1a;直接在nginx配置拦截actuator相关接口 location /actuator { return 403; …...

机器学习——SVM

1.什么是SVM 支持向量机&#xff08;support vector machines&#xff0c;SVM&#xff09;是一种二分类模型&#xff0c;它将实例的特征向量映射为空间中的一些点&#xff0c;SVM 的目的就是想要画出一条线&#xff0c;以 “最好地” 区分这两类点&#xff0c;以至如果以后有了…...

【音视频】FFmpeg 硬件(NVDIA)编码H264

FFmpeg 与x264的关系 ffmpeg软编码是使⽤x264开源项⽬&#xff0c;也就是说ffmpeg软编码H264最终是调⽤了x264开源项⽬&#xff0c;所以我们要先理解ffmpeg和x264的调⽤关系&#xff0c;这⾥我们主要关注x264_init。对于x264的参数都在 ffmpeg\libavcodec \libx264.c x264\co…...

贪心算法应用:超图匹配问题详解

贪心算法应用&#xff1a;超图匹配问题详解 贪心算法在超图匹配问题中有着广泛的应用。下面我将从基础概念到具体实现&#xff0c;全面详细地讲解超图匹配问题及其贪心算法解决方案。 一、超图匹配问题基础 1. 超图基本概念 **超图&#xff08;Hypergraph&#xff09;**是普…...

OpenCV CUDA模块结构分析与形状描述符------计算指定阶数的矩(Moments)所需的总数量函数:numMoments

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于计算指定阶数的矩&#xff08;Moments&#xff09;所需的总数量。 在图像处理中&#xff0c;矩&#xff08;moments&#xff09;是一…...

【Web应用】若依框架:基础篇13 源码阅读-前端代码分析

文章目录 ⭐前言⭐一、课程讲解过程⭐二、自己动手实操⭐总结 标题详情作者JosieBook头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师博客内容开源、框架、软件工程、全栈&#xff08;,NET/Java/Python/C&#xff09;、数据库、操作系统、大数据、人工智能、工控、网…...

[java八股文][JavaSpring面试篇]SpringCloud

了解SpringCloud吗&#xff0c;说一下他和SpringBoot的区别 Spring Boot是用于构建单个Spring应用的框架&#xff0c;而Spring Cloud则是用于构建分布式系统中的微服务架构的工具&#xff0c;Spring Cloud提供了服务注册与发现、负载均衡、断路器、网关等功能。 两者可以结合…...

深度学习篇---face-recognition的优劣点

face_recognition库是一个基于 Python 的开源人脸识别工具,封装了 dlib 库的深度学习模型,具有易用性高、集成度强的特点。以下从技术实现、应用场景等维度分析其优劣势: 一、核心优势 1. 极简 API 设计,开发效率极高 代码量少:几行代码即可实现人脸检测、特征提取和比对…...

基于分布式状态机的集装箱智能道口软件架构方法

集装箱码头对进出场道口的通过能力始终是要求最高的&#xff0c;衡量道口的直接指标为道口通行效率&#xff0c;道口通行效率直接体现了集装箱码头的作业效率以及对外服务水平&#xff0c;进而直接影响到码头的综合能力。所以&#xff0c;码头普遍使用智能道口实现24小时无人值…...

Oracle的Hint

racle的Hint是用来提示Oracle的优化器&#xff0c;用来选择用户期望的执行计划。在许多情况下&#xff0c;Oracle默认的执行方式并不总是最优的&#xff0c;只不过由于平时操作的数据量比较小&#xff0c;所以&#xff0c;好的执行计划与差的执行计划所消耗的时间差异不大&…...

手动事务的使用

使用原因&#xff1a; 公司需要写一个定时任务&#xff0c;涉及增改查操作&#xff0c; 定时将前端页面配置的字典数据&#xff08;标签数据&#xff09;同步到数据库特定的表(标签表) 查询字典表数据 字典有,数据库表没有新增 都有&#xff0c;判断名称&#xff0c;名称不同修…...

Vue 树状结构控件

1、效果图如下所示&#xff1a; 2、网络请求的数据结构如下&#xff1a; 3、新建插件文件&#xff1a;menu-tree.vue&#xff0c;插件代码如下&#xff1a; <template><div class"root"><div class"parent" click"onParentClick(pare…...

Spring Boot的启动流程,以及各个扩展点的执行顺序

目录 1. 初始化阶段执行顺序 1.1 Bean的构造方法&#xff08;构造函数&#xff09; 1.2 PostConstruct 注解方法 1.3 InitializingBean 的 afterPropertiesSet() 1.4 Bean(initMethod "自定义方法") 2. 上下文就绪后的扩展点 2.1 ApplicationContext 事件监听…...

【LUT技术专题】图像自适应3DLUT代码讲解

本文是对图像自适应3DLUT技术的代码解读&#xff0c;原文解读请看图像自适应3DLUT文章讲解 1、原文概要 结合3D LUT和CNN&#xff0c;使用成对和非成对的数据集进行训练&#xff0c;训练后能够完成自动的图像增强&#xff0c;同时还可以做到极低的资源消耗。下图为整个模型的…...

Apache Doris 在数据仓库中的作用与应用实践

在当今数字化时代&#xff0c;企业数据呈爆炸式增长&#xff0c;数据仓库作为企业数据管理和分析的核心基础设施&#xff0c;其重要性不言而喻。而 Apache Doris&#xff0c;作为一款基于 MPP&#xff08;Massively Parallel Processing&#xff0c;大规模并行处理&#xff09;…...

vscode使用“EIDE”和“Cortex-Debug”插件利用st-link插件实现程序烧写以及调试工作

第一步&#xff1a;安装vscode插件“EIDE”EIDE和“Cortex-Debug”。 第二步&#xff1a;配置EIDE 2.1安装“实用工具”&#xff1a; 2.2 EIDE插件配置&#xff1a;根据安装的keil C51 keil MDK IAR的相关路径设置 第三步&#xff1a;配置Cortex-Debug插件 点击settings.jso…...

Spring @Value注解的依赖注入实现原理

Spring Value注解的依赖注入实现原理 一&#xff0c;什么是Value注解的依赖注入二&#xff0c;实现原理三&#xff0c;代码实现1. 定义 Value 注解2. 实现 InstantiationAwareBeanPostProcessor3. 实现 AutowiredAnnotationBeanPostProcessor4. 占位符解析逻辑5. 定义 StringVa…...

三、kafka消费的全流程

五、多线程安全问题 1、多线程安全的定义 使用多线程访问一个资源&#xff0c;这个资源始终都能表现出正确的行为。 不被运行的环境影响、多线程可以交替访问、不需要任何额外的同步和协同。 2、Java实现多线程安全生产者 这里只是模拟多线程环境下使用生产者发送消息&…...

商品模块中的多规格设计:实现方式与电商/ERP系统的架构对比

在商品管理系统中&#xff0c;多规格设计&#xff08;Multi-Specification Product Design&#xff09;是一个至关重要但又极具挑战性的领域。无论是面向消费者的电商系统&#xff0c;还是面向企业管理的ERP系统&#xff0c;对商品规格的处理方式直接影响库存管理、订单履约、数…...

(三)动手学线性神经网络:从数学原理到代码实现

1 线性回归 线性回归是一种基本的预测模型&#xff0c;用于根据输入特征预测连续的输出值。它是机器学习和深度学习中最简单的模型之一&#xff0c;但却是理解更复杂模型的基础。 1.1 线性回归的基本元素 概念理解&#xff1a; 线性回归假设输入特征和输出之间存在线性关系。…...

Axure形状类组件图标库(共8套)

点击下载《月下倚楼图标库(形状组件)》 原型效果&#xff1a;https://axhub.im/ax9/02043f78e1b4386f/#g1 摘要 本图标库集锦精心汇集了8套专为Axure设计的形状类图标资源&#xff0c;旨在为产品经理、UI/UX设计师以及开发人员提供丰富多样的设计素材&#xff0c;提升原型设计…...