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

news2024/12/23 6:00:01

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.coloradmin.cn/o/2196116.html

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

相关文章

【文献阅读】Transfer Learning For Text Classification Via Model Risk Analysis

前言:本文是以文本分类的迁移学习任务为例,对风险分析模型的整体框架流程做梳理。 目录 1. LearnRisk1.1 motivatio1.2 overall 2. LearnRisk-TC2.1 构造风险特征2.1.1 risk metric2.1.2 risk feature 2.2 构建风险模型2.3 训练风险模型2.4 微调base mod…

线性代数入门

线性代数入门 线性代数(Linear Algebra)是数学的重要分支之一,广泛应用于工程、计算机科学、物理学、经济学等领域。它主要研究向量、矩阵及其在空间中的变换。对于程序员来说,掌握线性代数的基础知识能够帮助更好地理解数据处理…

边缘人工智能(Edge Intelligence)

边缘人工智能(Edge AI)是指在边缘设备上直接运行人工智能(AI)和机器学习(ML)算法的技术。机器学习是一个广泛的领域,近年来取得了巨大的进步。它所基于的原则是,计算机可以通过从数据…

Qt-QGridLayout布局类控件(43)

目录 描述 属性 使用 常规使用 垂直布局 水平布局 布局是按照相对大小进行的 拉伸系数 使用 设置水平拉伸系数 设置垂直拉伸系数 描述 Qt 中还提供了 QGridLayout ⽤来实现⽹格布局的效果.可以达到 M * N的这种⽹格的效果 属性 layoutLeftMargin左侧边距layoutRig…

Windows 安装 Maven 并配置环境变量

一、简介 Maven 是一款基于 Java 平台的项目管理和整合工具,用来构建项目的。也就是清理、编译、测试、运行、打包、安装整个过程都交给 Maven 管理,整个过程就是构建。 二、安装 Java JDK Maven 依赖 Java JDK,如果本机没有安装过 Java 的…

NASA:第三版大气痕量分子光谱(ATMOS)2 级产品,包含垂直高度(千米)网格上的痕量气体

目录 简介 摘要 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 ATMOS L2 Trace Gases on Altitude Grid, Fixed Field Format V3 (ATMOSL2AF) at GES DISC 简介 高度网格上的 ATMOS L2 跟踪气体,固定字段格式 V3 (ATMOSL2AF) 这是第三版大气痕量分子…

CMake学习笔记:项目的导出和安装-install命令

一、基本语法与概念 1.文件的安装 install(FILES) 用Poco库 usr/local/poco/CMakeLists.txt中内容 举例如下: 2.目标安装 install(TARGETS) 3.导出目标与导出配置文件 将目标mylib导出名为MyModules的目标。MyModules导出目标包含了关于mylib的所有信息&#xf…

【初阶数据结构】冒泡排序和选择排序(用C语言实现,主要讲思维)

文章目录 前言1. 冒泡排序1.1 算法思想1.2 冒泡排序的代码实现1.3 冒泡排序算法的改进 2. 选择排序2.1 算法思想2.2 选择排序的代码实现 3. 写排序算法的小技巧 前言 讲到排序相信大家一定对一种排序很熟悉,它的名字就叫做冒泡排序。这个排序大家在学习各种语言时&…

【优选算法】(第二十六篇)

目录 两数相加(medium) 题目解析 讲解算法原理 编写代码 两两交换链表中的节点(medium) 题目解析 讲解算法原理 编写代码 两数相加(medium) 题目解析 1.题目链接:. - 力扣(…

随着硬件水平的提升,LabVIEW有哪些过去的编程方法被淘汰掉了

随着硬件水平的不断提升,尤其是处理器性能、存储能力、通信速度等方面的飞跃,LabVIEW的一些早期编程方法逐渐被更高效、现代的编程技术所取代。以下是一些随着硬件升级而逐步淘汰的LabVIEW编程方法和技术: 1. 低效的数据流传输方式 过去由于…

SQL执行顺序是如何工作的,为什么它如此重要?

🎯SQL执行顺序是如何工作的,为什么它如此重要? SQL查询按照以下顺序执行其语句: 1️⃣FROM / JOIN 2️⃣WHERE 3️⃣GROUP BY 4️⃣HAVING 5️⃣SELECT 6️⃣DISTINCT 7️⃣ORDER BY 8️⃣LIMIT / OFFSET 你在每个步骤中实现的技…

特定类型的图与应用 - 离散数学系列(六)

目录 1. 树和生成树 树的定义 生成树与最小生成树 2. 二分图 二分图的定义 示例:最大匹配问题 3. 欧拉图与哈密顿图 欧拉图 哈密顿图 4. 实际应用场景 1. 文件系统中的树结构 2. 网络优化中的最小生成树 3. 社交网络分析 5. 例题与练习 例题1&#xf…

sv标准研读第十三章-task和function

书接上回: sv标准研读第一章-综述 sv标准研读第二章-标准引用 sv标准研读第三章-设计和验证的building block sv标准研读第四章-时间调度机制 sv标准研读第五章-词法 sv标准研读第六章-数据类型 sv标准研读第七章-聚合数据类型 sv标准研读第八章-class sv标…

【直接原地起飞】3DMAX2025热门插件合集来啦!

强烈推荐8款3DMAX2025热门插件! 在3DMAX的广阔世界里,插件如同魔法工具,为设计师们打开了无限创意的大门。今天,我们精心挑选了8款热门插件,它们不仅功能强大,而且易于上手,定能让你的3D设计之旅…

Python从0到100(六十二):机器学习实战-预测波士顿房价

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

增强分析:新时代的数据洞察工具

随着数据科学和人工智能的迅猛发展,分析数据的方式也发生了显著的变化。增强分析(Augmented Analytics)是近年来涌现出的新概念,它将人工智能(AI)、机器学习(ML)和自然语言处理&…

操作系统 | 学习笔记 | 王道 | 4.2 目录

4.2 目录 4.2.1 目录的基本概念 文件目录指FCB的有序集合,一个FCB就是一个文件的目录项。与文件管理系统和文件集合相关联的是文件目录,它包含有关文件的属性、位置和所有权等。 目录管理的基本要求: 从用户的角度看,目录在用户…

win11下AMD CPU支持WSL2

除开常规的配置: 1.打开虚拟机 2.打开hyper-v 3.bios启用虚拟机 还需要做如下操作: 管理员方式进入Powershell: bcdedit /set hypervisorlaunchtype auto 成功案例: win11: cpu: amd

00_概览_kafka

kafka 概述kafka版本流程启动zk配置zk启动命令 启动kafka修改server.properties启动命令 kafka脚本-命令行操作命令行创建主题脚本查看主题主题详情修改主题删除主题大量日志解决方案 控制台生产者消费者代码 生产者 消费者kafka-toolkafka数据文件 扩展横向扩展纵向扩展分区消…

【小沐学GIS】QGIS导出OpenStreetMap数据(QuickOSM、OSM)

文章目录 1、简介1.1 OSM1.2 QuickOSM1.3 Overpass Turbo 2、插件安装3、插件使用3.1 快速查询(boundary边界)3.2 快速查询(railway铁路)3.3 快速查询(boundaryadmin_level行政边界)3.4 快速查询&#xff0…