MYSQL 常见锁机制详解,常见锁问题排查及分析

1,锁分类

锁冲突是影响数据库性能的重要指标,本章节介绍MYSQL常见锁,及各种说的常用示例,mysql锁的分类如下:

        从操作类型分类:读锁、写锁;

        从操作粒度分类:表锁、页锁、行锁;

        1.1,读锁(共享锁)

        事务T 对某行数据A 加读锁后,所有事务(包括T)的读操作可同时进行且互不影响,但都不可对数据进行修改。加读锁如下:

SELECT * FROM t_account WHERE id = 1 LOCK IN SHARE MODE;

        1.2,写锁(排他锁)

        事务T 对某行数据A 加写锁后,事务T可 读取A 也可修改A,其他事物即不能读取A也不能修改A。所有对数据的增/删/改操作都会为数据加上写锁,读操作可通过for update添加写锁:

SELECT * FROM t_account WHERE id = 1 FOR UPDATE;

        1.3,表锁

        每次操作锁住整张表。操作快,开销小,粒度大,并发度低。表锁细分为:表读锁、表写锁。

                1.3.1,表读锁(表共享锁):事务T对表加读锁后,其他事务(包括T)都可对该表加读锁,不能加写锁。即:读操作可同时进行,写操作都不能进行。

                1.3.2,表写锁(表独占锁):事务T对表加写锁后,事务T可对表数据读/写,其他事务不可读/写。需等事务T释放表锁后才可添加表锁。

        表读锁/写锁及释放表锁方式:

-- 表读锁
LOCK TABLE t_account READ;
-- 表写锁
LOCK TABLE t_account WRITE;
-- 释放表锁
UNLOCK TABLES;
-- 查看加锁的表
SHOW OPEN TABLES;

        1.4,页锁

        日常开发极少用到。在第一篇索引数据结构中,聚簇索引的叶子结点包含了主键及对应数据,叶子结点在磁盘中是分页存储的,页锁即锁定一片叶子结点数据页。

        1.5,行锁(重要)

        相比较表锁,每次操作锁住一行。操作慢,开销大,粒度小,并发度高,但是会出现死锁。行锁是InnoDB特有特性,InnoDB相比MYISAM存储引擎,有如下优势:

  •         InnoDB支持事务;
  •         InnoDB支持行锁;
注意,InnoDB的行锁实际上是针对索引加的锁(在索引对应的索引项上做标记),不是针对整个行记录加的锁。并且该索引不能失效,否则会从行锁升级为表锁。

        行锁示例

        原表数据如下:
为第一行数据添加行锁:
修改id=4的数据,将balance改为5000,成功。
另起一个事务二,普通查询id=1的数据(select * from t_account where id = 1),成功。
事务二加锁查询id=1的数据,阻塞!需等待原行锁释放锁,事务二才能获取id=1的行锁,如图:
事务二更新id=1的数据,阻塞!

        结论:

        1,行锁只锁定当前行的写操作,其他事务对当前行的非加锁的读操作可正常执行,加锁读操作或写操作均不可执行;

        2,其他行的读写操作不受影响;

        3,SQL命中主键索引(id)、非主键单个字段索引(idx_name)、组合索引(idx_name_balance)都可实现锁行。组合索引未命中时,行锁将升级为表锁;

        以下语句都是行锁:

        select * from t_account where id = 5 for update;

        select * from t_account where name = 'lilei' for update;

        select * from t_account where name = 'lilei'  and balance = 1000 for update;

        下述语句行锁将升级为表锁:

        select * from t_account where balance = 1000 for update;

        4,非索引字段查询,行锁直接升级为表锁;

        5,行锁升级为表锁,只在RR级别发生,RC级别不会升级为表锁;

 1.6,间隙锁

        间隙锁只有在RR级别才会生效,指锁住数据间的间隙数据。

如上图,表中数据有共有三个间隙(4~10),(10~20),(20~+∞),只要在间隙范围内,锁住一条不存在的记录,即会锁住整个间隙(不包含边界),间隙锁发生后,其他事务无法在该间隙内插入新数据。示例如下:

锁住ID= 7的数据行,实际改行并不存在。此时新增插入间隙内id = 6的数据,事务会被阻塞。

其他间隙可正常插入数据,将id改为11,换成其他间隙内数据立马插入成功。

锁总结:

        1,读锁会阻塞写,但是不会阻塞读。而写锁则会把读和写都阻塞;

        2,MyISAM在执行查询语句SELECT前,会自动给涉及的所有表加读锁,在执行update、insert、delete操作会 自动给涉及的表加写锁。

        3,InnoDB在执行查询语句SELECT时(非串行隔离级别),不会加锁。但是update、insert、delete操作会加行锁。

2,锁问题分析及排查

InnoDB的行锁虽然提供了高效的并发支持,但使用不当时会造成大量资源被锁住,甚至出现死锁。当系统的数据库性能出现问题时,可通过查看数据库中锁的各种指标来分析,查找并解决长时间占用锁的事务或直接杀死死锁事务。常用操作如下:
上述指标中,当1,3,4的结果增加时,系统已出现数据库问题,需查找对应的事务,分析sql语句,修改对应的业务处理方式。
如何查处相关的事务id,方式如下,先执行更新操作且不提交事务,模拟异常事务
查询事务语句及结果如下:

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

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

相关文章

文献阅读Prov-GigaPath模型--相关知识点罗列

文章链接:A whole-slide foundation model for digital pathology from real-world data | NatureDigital pathology poses unique computational challenges, as a standard gigapixel slide may comprise tens of thousands of image tiles1–3. Prior models hav…

Java中的二维数组

二维数组 使用方式1:动态初始化1.语法:2.比如:3.二维数组在内存的存在形式 使用方式2:动态初始化使用方法3:动态初始化--列数不确定使用方式4:静态初始化1.定义2.使用 使用方式1:动态初始化 1.…

HiRT | 异步控制策略,告别VLA时延问题

论文:HiRT: Enhancing Robotic Control with Hierarchical Robot Transformers 前言:HiRT 通过异步处理的策略,将 VLM 作为低频慢思考过程,将轻量的动作策略模型作为高频快响应过程 ,以此解决 VLA 驱动带来的控制时延问…

RNN经典案例——构建人名分类器

RNN经典案例——人名分类器 一、数据处理1.1 去掉语言中的重音标记1.2 读取数据1.3 构建人名类别与人名对应关系字典1.4 将人名转换为对应的onehot张量 二、构建RNN模型2.1 构建传统RNN模型2.2 构建LSTM模型2.3 构建GRU模型 三、构建训练函数并进行训练3.1 从输出结果中获得指定…

TON生态小游戏开发:推广、经济模型与UI设计的建设指南

随着区块链技术的快速发展,基于区块链的Web3游戏正引领行业变革。而TON生态小游戏,借助Telegram庞大的用户基础和TON(The Open Network)链上技术,已成为这一领域的明星之一。国内外开发者正迅速涌入,开发和…

基于SpringBoot+Vue的船舶监造系统(带1w+文档)

基于SpringBootVue的船舶监造系统(带1w文档) 基于SpringBootVue的船舶监造系统(带1w文档) 大概在20世纪90年代,我国才开始研发船舶监造系统,与一些发达国家相比,系统研发起步比较晚。当时的计算机技术刚开始发展起来,国家经济力量…

SEO(搜索引擎优化)指南

SEO(Search Engine Optimization)是通过优化网站内容、结构和外部链接,提升网页在搜索引擎结果中的排名,从而增加网站流量的过程。SEO 涉及多个层面,包括技术 SEO、内容优化、外部链接建设等。以下是 SEO 的核心优化策…

京东零售数据湖应用与实践

作者:陈洪健:京东零售大数据架构师,深耕大数据 10 年,2019 年加入京东,主要负责 OLAP 优化、大数据传输工具生态、流批一体、SRE 建设。 当前企业数据处理广泛采用 Lambda 架构。Lambda 架构的优点是保证了数据的完整性…

【论文阅读】Learning a Few-shot Embedding Model with Contrastive Learning

使用对比学习来学习小样本嵌入模型 引用:Liu, Chen, et al. “Learning a few-shot embedding model with contrastive learning.” Proceedings of the AAAI conference on artificial intelligence. Vol. 35. No. 10. 2021. 论文地址:下载地址 论文代码…

强化学习笔记之【SAC算法】

强化学习笔记之【SAC算法】 前言: 本文为强化学习笔记第三篇,第一篇讲的是Q-learning和DQN,第二篇DDPG,第三篇TD3 TD3比DDPG少了一个target_actor网络,其它地方有点小改动 CSDN主页:https://blog.csdn.n…

思迈特:在AI时代韧性增长的流量密码

作者 | 曾响铃 文 | 响铃说 “超级人工智能将在‘几千天内’降临。” 最近,OpenAI 公司 CEO 山姆奥特曼在社交媒体罕见发表长文,预言了这一点。之前,很多专家预测超级人工智能将在五年内到来,奥特曼的预期,可能让这…

图论day57|建造最大岛屿(卡码网)【截至目前,图论的最高难度】

图论day57|建造最大岛屿(卡码网)【截至目前所做的题中,图论的最高难度】 思维导图分析 104.建造最大岛屿(卡码网)【截至目前所做的题中,图论的最高难度】 思维导图分析 104.建造最大岛屿(卡码网…

i18n多语言项目批量翻译工具(支持84种语言)

这里写自定义目录标题 打开‘i18n翻译助手’小程序快捷访问 打开‘i18n翻译助手’小程序 1.将需要翻译的json文件复制到输入框(建议一次不要翻译过多,测试1000条以内没什么问题) 2.等待翻译 3.翻译完成,复制结果 快捷访问

从容应对DDoS攻击:小网站的防守之战

前几天收到云服务商短信,服务器正在遭受DDoS攻击 说实话,我的网站只是一个小型站点,平时访问量并不高,没想到会成为攻击的目标。当我看到这次DDoS攻击的通知时,我其实既惊讶又有点小小的“荣幸”,毕竟我的小…

火山引擎边缘智能×扣子,拓展AI Agent物理边界

9月21日, 火山引擎边缘智能扣子技术沙龙在上海圆满落地,沙龙以“探索端智能,加速大模型应用”为主题,边缘智能、扣子、地瓜机器人以及上海交大等多位重磅嘉宾出席,分享 AI 最新趋势及端侧大模型最新探索与应用实践。 …

Java项目-----图形验证码登陆实现

原理: 验证码在前端显示,但是是在后端生成, 将生成的验证码存入redis,待登录时,前端提交验证码,与后端生成的验证码比较. 详细解释: 图形验证码的原理(如下图代码).前端发起获取验证码的请求后, 1 后端接收请求,生成一个键key(随机的键) 然后生成一个验证码作为map的valu…

JAVA接入GPT开发

Spring AI Alibaba:Java开发者的GPT集成新标准 目前,像OpenAI等GPT服务提供商主要提供HTTP接口,这导致大部分Java开发者在接入GPT时缺乏标准化的方法。为解决这一问题,Spring团队推出了Spring AI Alibaba,它作为一套标…

基于Java的可携宠物酒店管理系统的设计与实现(论文+源码)_kaic

摘 要 随着社会经济的不断发‎‏展,现如今出行并住酒店的人越来越多,与之而来的是酒店行业的工作量日益增加,酒店的管理效率亟待提升。此外很多人出门旅游时会有携带宠物的情况,但是现如今酒店对宠物的限制,导致许多…

Java学习-JVM

目录 1. 基本常识 1.1 JVM是什么 1.2 JVM架构图 1.3 Java技术体系 1.4 Java与JVM的关系 2. 类加载系统 2.1 类加载器种类 2.2 执行顺序 2.3 类加载四个时机 2.4 生命周期 2.5 类加载途径 2.6 双亲委派模型 3. 运行时数据区 3.1 运行时数据区构成 3.2 堆 3.3 栈…

【RabbitMQ高级——过期时间TTL+死信队列】

1. 过期时间TTL概述 过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费者接收获取;过了之后消息将自动被删除。RabbitMQ可以对消息和队列设置TTL。 目前有两种方法可以设置。 第一种方法是通过队列属性设置,队列中所有消…