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

news2024/11/30 7:49:44

一、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.coloradmin.cn/o/1555879.html

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

相关文章

Cocos Creator 常见问题记录

目录 问题1、精灵图九宫格,角度不拉伸 问题2、BlockInputEvents 防止透屏 问题1、精灵图九宫格,角度不拉伸 点击编辑,拖拽到可变区域 问题2、BlockInputEvents 防止透屏

真实sql注入以及小xss--BurpSuite联动sqlmap篇

前几天漏洞检测的时候无意发现一个sql注入 首先我先去网站的robots.txt去看了看无意间发现很多资产 而我意外发现admin就是后台 之后我通过基础的万能账号密码测试or ‘1‘’1也根本没有效果 而当我注入列的时候情况出现了 出现了报错,有报错必有注入点 因此我…

【c 语言 】malloc函数详解

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:C语言 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步&…

密码学基础-对称密码/公钥密码/混合密码系统 详解

密码学基础-对称密码/公钥密码 加解密说明1.加密解密必要因素加密安全性说明 什么是对称密码图示说明对称密码详解什么是DES?举例说明 什么是3DES什么是AES? 公钥密码什么是RSA? 对称密钥和公钥密码优缺点对比对称密码对称密码算法总结对称密码存在的问题? 公钥密码公钥密码…

真实工作中的编程,与在校coder有哪些不同?

工作中的编程和学校里最大的不同在于:在完整的流程规范下,同事间协同开发,按时按量交付,并不断测试迭代优化,最终能稳定的用于生产。 有人说这是软件开发,并不是编程啊。对这就是工作编程和学校编程的差异…

pdf在浏览器上无法正常加载的问题

一、背景 觉得很有意思给大家分享一下。事情是这样的,开发给我反馈说,线上环境接口请求展示pdf异常,此时碰巧我前不久正好在ingress前加了一层nginx,恰逢此时内心五谷杂陈,思路第一时间便放在了改动项。捣鼓了好久无果…

字符集 --java学习笔记

字符集 为了将字符存进计算机,所以有了字符集 标准ASCI字符集 ASCl(American standard Code for Information Interchange):美国信息交换标准代码,包括了英文、符号等标准ASCI使用1个字节存储一个字符,首尾是0,总共可表示128个…

Typora结合PicGo + Github搭建个人图床

目录 一 、GitHub仓库设置 1、新建仓库 2、创建Token 并复制保存 二、PicGo客户端配置 1、下载 & 安装 2、配置图床 三、Typora配置 一 、GitHub仓库设置 1、新建仓库 点击主页右上角的 号创建 New repository 填写仓库信息 2、创建Token 并复制保存 点击右上角…

二、Java语法基础

1、Java语言的关键字、标识符及命名规范 1)java关键字 2)标识符 3)JAVA中的命名规范 包名的命名规范:域名.公司名称.项目名称.模块名称 类的命名规范:首字母大写,第二个单词的首字母大写,以此类推。 2、进制间的转换(二进制、十进制) 1)十进制->二进制 采用…

深入探讨Docker in Docker:原理与实战指南

在软件开发和部署中,容器化技术已经成为一个不可或缺的工具。而在使用Docker进行容器化时,有时可能会遇到需要在一个Docker容器中运行另一个Docker容器的情况,这就是所谓的"Docker in Docker"(简称DinD)。本…

新能源充电桩站场视频汇聚系统建设方案及技术特点分析

随着新能源汽车的普及,充电桩作为新能源汽车的基础设施,其安全性和可靠性越来越受到人们的关注。为了更好地保障充电桩的安全运行与站场管理,TSINGSEE青犀&触角云推出了一套新能源汽车充电桩视频汇聚管理与视频监控方案。 方案采用高清摄…

先进电气技术 —— 储能系统技术原理是什么?有哪些技术发展点?

一、储能系统基本原理 储能系统是一种能够存储电能并在需要时释放电能的技术装置。在电力系统、可再生能源利用、电力供需调节等领域,储能系统扮演着至关重要的角色。其工作原理主要包括以下几个步骤: 1. **充电阶段**: - 当电力供应充足…

通义千问7B大模型微调

阿里云机器学习试用 登录阿里云,搜索PAI和NAS申请试用即可,都是三个月 工作空间创建好了之后再来创建实例,所谓的实例也即我们运行的云服务器的节点。由于云服务器通常基于虚拟化容器部署,所以会被称为实例,简单…

黑马程序员 Java 入门 笔记

一、基础概念 注释和关键字字面量:告诉程序员数据在程序中书写格式 分类:整数、小数、字符、字符串、布尔、空 特殊字面量:制表符 ‘\t’ 空null(加" "才能输出) 变量 加减法数据存储 数据类型 基本数据类型 整数浮点数字符布尔…

硬件17、PCB在机械层确定板子大小和形状以及后续拓宽板子

确定板子的形状和大小 (1)在机械层用线画出板子的形状和大小,然后全选中线,然后设计-》板子形状-》按照选择对象定义 这就是确定板子的原点 板子的形状大小规划一定是在机械层 在机械层使用直线画出想要的板子形状 设置这段线为2cm,也就…

如何在极狐GitLab 配置 邮件功能

本文作者:徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了在极狐GitLab 用户…

redis集群配置(精华版):主从复制模式

主从复制模式 概念:作用:为什么使用集群:动手实操1、环境准备2、配置redis.conf配置文件3、再次查看主从节点信息4、验证主从模式 概念: ​ 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器…

Java基础语法(三)| 循环语句

前言 Hello,大家好!很开心与你们在这里相遇,我是一个喜欢文字、喜欢有趣的灵魂、喜欢探索一切有趣事物的女孩,想与你们共同学习、探索关于IT的相关知识,希望我们可以一路陪伴~ 1. if语句 1.1 格式一 if (关系表达式) …

Halcon3D表面平面度检测-平面差值法

//倾斜平面矫正 https://blog.csdn.net/m0_51559565/article/details/137146179 //平面度和平面缺陷检测,平面矫正法 https://blog.csdn.net/m0_51559565/article/details/137163729前言 通常我们对表面平面度进行检测时,通常使用2种方式。1&#xff1a…

【目录整理】(五)

​​​​​Git 基础 Git 详细安装教程文章浏览阅读10w次,点赞9.6k次,收藏1.7w次。Git 是个免费的开源分布式版本控制系统,下载地址为git-scm.com 或者 gitforwindows.org,本文介绍 Git-2.40.0-64-bit.exe 版本的安装方法&#x…