MySQL Innodb 引擎中预防 Update 操作上升为表锁

一、MySQL 如何预防 Update 上升为表锁

MySQL 中,进行任何数据的 修改 操作都会进行一定的锁操作,而锁的不同直接导致性能的差异。例如 MyISAM 引擎,更新时采用表锁,并发性较差。而 Innodb 引擎支持事务,更新时采用行锁,锁的粒度更细,所以并发性较高。

由于表锁的粒度过大,即使只有部分行被修改,也会阻塞其他事务对整个表的写操作,限制了系统的吞吐量和响应速度。对于在Innodb 引擎中,虽然采用了粒度更细的行锁,但也不是所有的数据修改操作都是仅锁住相关的行,有时很可能不注意就导致了表锁。

下面通过一个实验进行深入:

例如有如下表结构:

CREATE TABLE `user` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`age` int DEFAULT NULL,`sex` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`),KEY `idx_user_name_age` (`name`,`age`),KEY `name` (`name`,`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

写入一些测试数据:

INSERT INTO `test`.`user` (`id`, `name`, `age`, `sex`) VALUES (1, '小明', 18, '男');
INSERT INTO `test`.`user` (`id`, `name`, `age`, `sex`) VALUES (2, '小红', 19, '女');
INSERT INTO `test`.`user` (`id`, `name`, `age`, `sex`) VALUES (3, '小蓝', 16, '女');
INSERT INTO `test`.`user` (`id`, `name`, `age`, `sex`) VALUES (4, '小王', 17, '男');
INSERT INTO `test`.`user` (`id`, `name`, `age`, `sex`) VALUES (5, '张三', 18, '男');
INSERT INTO `test`.`user` (`id`, `name`, `age`, `sex`) VALUES (6, '李四', 19, '男');
INSERT INTO `test`.`user` (`id`, `name`, `age`, `sex`) VALUES (7, '王五', 20, '男');
INSERT INTO `test`.`user` (`id`, `name`, `age`, `sex`) VALUES (8, '赵六', 21, '男');

下面尝试在事务中修改姓名为张三的年龄为 20 岁,注意这里先不要着急提交事务:

BEGIN;
UPDATE user SET age = 20 WHERE name = '张三';

在这里插入图片描述

下面查看下前正在发生的数据锁情况:

SELECT * FROM performance_schema.data_locks WHERE OBJECT_NAME = "user"

在这里插入图片描述

从这里可以看出,锁住了表里所有的数据,已经上升为了表锁,但是上面仅更新了姓名为张三的数据,怎么会锁住那么多数据呢?

这是因为 name 字段没有索引,要找到姓名为张三的数据,就要进行全表扫描,但是 update 的时候要保证数据的一致性,所以此时相关的数据就是全部的表数据,因此也就相当于表锁了。

那怎么降低锁的粒度呢,既然是因为name 字段没有索引,那给 name 增加索引,再次进行上面实验呢。

增加索引:

ALTER TABLE user ADD INDEX index_name(name);

再次尝试修改但不提交事务:

BEGIN;
UPDATE user SET age = 20 WHERE name = '张三';

在这里插入图片描述

查看下前正在发生的数据锁情况:

SELECT * FROM performance_schema.data_locks WHERE OBJECT_NAME = "user"

在这里插入图片描述
可以看出此时并没有锁住全部的数据,但是锁住的 '张三', 5'李四', 6 是什么呢?

这其实是索引信息,如果修改操作涉及到了非主键索引,MySql会首先锁住非主键索引,再锁定具体数据的主键索引。至于会锁住李四就是 MySQLNext-KeyGAP 间隙锁的原因了,当准备更新张三时,以防止在这个范围内插入新的记录,所以将临近的李四也进行上锁。

从上面结果看增加了索引后已经解决了表锁的问题,但还是会锁住多余的内容,下面直接尝试根据主键进行修改:

BEGIN;
UPDATE user SET age = 20 WHERE id = 5 ;

在这里插入图片描述
再次查看下前正在发生的数据锁情况:

SELECT * FROM performance_schema.data_locks WHERE OBJECT_NAME = "user"

在这里插入图片描述

此时就仅锁住相关的数据了。

二、总结

从上面的实验过程来看,MySQL 中的修改操作很有可能导致表锁,因此最好在更新语句中使用主键列或其他索引列进行筛选。另外索引最好设置在不经常变更的字段上比较好,不然容易造成冲突死锁的情况。

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

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

相关文章

Windows SDK(五)按钮静态文本与编辑框控件

我们首先应该知道,所谓按钮静态文本等等控件都是窗口,他们都是隶属于父窗口下的子窗口,所 以在创建控件前,我们要首先创建一个父窗口,此处我们直接使用Windows桌面程序创建时,程 序自动为我们创建的一个窗…

类和对象(下)--- 初始化列表、explicit、友元、static、匿名对象和内部类

本篇将会对类和对象的主要知识收尾,先会对构造函数进行补充,分别补充了构造函数体赋值、初始化列表、explicit 关键字,然后介绍 static 成员知识以及友元、内部类还有匿名对象等知识点,目录如下: 目录 1. 构造函数补充…

VUE3——生命周期

Vue3.0中可以继续使用Vue2.x中的生命周期钩子,但有有两个被更名: beforeDestroy改名为 beforeUnmountdestroyed改名为 unmounted Vue3.0也提供了 Composition API 形式的生命周期钩子,与Vue2.x中钩子对应关系如下: beforeCreate&g…

【ROS 笔记5】话题发布与订阅————高级(一)

1. 前言 在使用ros pulisher时, 我们在建立话题 pub = rospy.Publisher(chatter, String, queue_size=10) 我们的目的时将我们的message (string)通过话题发布出去,如:pub.publish(hello_str)。 如果是为了处理单个话题的问题, 我们只用一个pub.publish()去发布就好。 …

matlab学习(一)(3.26-4.1)

一.信息隐藏的概念 信息隐藏是利用一些技术,使得要隐藏的信息是用眼睛看不出变化的。它将秘密信息隐藏在可公开的媒体信息中,使人们凭直观的视觉和听觉难以察觉基存在。 二.空域信息隐藏技术 空域信息隐藏是将信息直接嵌入到图像的像素值中的技术。主要…

洛谷 P2658 汽车拉力比赛

思路:二分BFS 题目的大意就是找出一个难度系数,让到达每一个路标之间的相邻格子的高度之差为难度系数。 所以,想要找到这个难度系数,我们需要不断地枚举数据范围内的数据,然后一个一个试试,全部BFS遍历一…

Mysql 和 Redis 数据怎么保持一致性,怎么实现

MySQL 和 Redis 是两种不同类型的数据库,MySQL 是关系型数据库,而 Redis 是键值存储的非关系型数据库。它们在数据一致性的保证上需要采取不同的策略,尤其是在分布式环境中。以下是一些保持 MySQL 和 Redis 数据一致性的常见策略:…

ISELED-演示项目代码

目录 一、main函数二、点灯函数一、main函数 int main(void) {/* Write your local variable definition here */iseledInitType.crcEnable = 1;iseledInitType.firstLedAdr = 1;iseledInitType.tempCmpEnable = 0;iseledInitType.voltSwing = 0;/*** End of Processor Expert…

简单了解裸眼3D呈现技术

裸眼3D呈现是一种不需要佩戴任何特殊设备(如3D眼镜或头盔)即可观看到3D效果的技术。这种技术近年来得到了快速发展,为观众带来了更加沉浸式的视觉体验。 实现裸眼3D呈现的关键步骤包括: 创建立体图像源:首先需要有一…

HWOD:记录正负数

一、知识点 1、scanf()的返回值 scanf()返回值类型为int,返回转换成功的个数 有代码int temp; scanf("%d",&temp); 在屏幕输入一个数字,比如5,回车,scanf()返回1 在屏幕输入一个字符或字符串,比…

STM32 M3内核寄存器概念

内容主要来自<<M3内核权威指南>> 汇编程序中的最低有效位&#xff08;Least Significant Bit&#xff09;。LSB是二进制数中最右边的位&#xff0c;它代表了数值中的最小单位。在汇编程序中&#xff0c;LSB通常用于表示数据的最小精度或者作为标志位。 ---------…

人工智能|深度学习——基于Xception算法模型实现一个图像分类识别系统

一、Xception简介 在计算机视觉领域&#xff0c;图像识别是一个非常重要的任务&#xff0c;其应用涵盖了人脸识别、物体检测、场景理解等众多领域。随着深度学习技术的发展&#xff0c;深度卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff…

linux下tar命令的压缩和解压详细使用方法

在Linux系统中&#xff0c;tar命令用于创建、查看、提取和解压 tar 存档文件。以下是 tar 命令的一些常见用法&#xff1a; 压缩文件或目录&#xff1a; tar -czvf archive.tar.gz /path/to/directory # 压缩目录为 .tar.gz 格式的文件tar -czvf archive.tar.gz file1 file2 …

测试人员前期参与设计方案时需要注意什么?

服务的健壮性跟系统设计有很大关系&#xff0c;前期设计时考虑多一些处理逻辑&#xff0c;可以避免后期出现问题带来的损失以及修复问题的成本。 在前期讨论设计方案时测试同学也需要参与&#xff0c;而不只是埋头设计用例和测试&#xff0c;开发同学可能因为思维局限或者思考…

ssm018简易版营业厅宽带系统+jsp

营业厅宽带系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本营业厅宽带系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间…

LeetCode 977 有序数组的平方(双指针法)

给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1a;平方后&#xff0c;数组变为 […

QCustomPlot一、QCustomPlot基础及画图显示

1、QCustomPlot下载 QCustomPlot源码demo 根据需要选择需要的文件&#xff1a; 完整版。QCustomPlot.tar.gz 源代码例子帮助文档&#xff1b; 共享库。QCustomPlot-sharedlib.tar.gz 库编译和使用&#xff1b; 源代码。QCustomPlot-source.tar.gz 源代码 里面包含了很多QCusto…

夜晚兼职好选择:六大副业助你增收

晚上兼职&#xff0c;无疑是许多寻求额外收入人群的理想选择。以下为您精心推荐的六个副业&#xff0c;既适合晚间操作&#xff0c;又能让您在轻松愉悦中赚取额外收益。 网络调查与市场研究&#xff1a;利用晚上的闲暇时光&#xff0c;参与网络调查与市场研究&#xff0c;为企业…

TO-277肖特基二极管 散热效果好 型号齐全

市场对于肖特基二极管的需求非常旺盛&#xff0c;近日常有客户前来东沃电子咨询TO-277B 封装系列肖特基二极管选型、价格、交期、现货等方面的问题。东沃电子推出的TO-277B 封装系列肖特基产品&#xff0c;外形扁平&#xff0c;散热片外露设计&#xff0c;能够有效改善散热能力…

JAVA 100道题(25)

25.实现一个死锁示例&#xff0c;并解释如何避免死锁。 在Java中&#xff0c;死锁通常发生在两个或更多的线程无限期地等待一个资源&#xff0c;而该资源又被另一个线程持有&#xff0c;后者也在等待另一个线程释放资源。这形成了一个循环等待条件&#xff0c;导致所有涉及的线…