MySQL数据库的锁机制
目录
一、引言
二、锁的类型及作用
2.1 行级锁
2.2 间隙锁与临键锁
2.3 共享锁与排他锁
2.4 意向锁
2.5 表级锁
2.6 元数据锁
三、锁的管理与优化
3.1 合理设置事务隔离级别
3.2 避免长事务
3.3 索引优化
3.4 明确锁定范围
3.5 避免不必要的全表扫描
四、实战分析
4.1 行级锁验证
4.2 间隙锁和临键锁验证
4.3 共享锁验证
五、总结
一、引言
MySQL数据库的锁是控制并发访问和事务处理中数据一致性的一种机制。在多用户环境或并发事务环境下,不同的事务同时尝试对相同的数据进行读取或修改操作,为了防止多个事务间相互干扰导致数据不一致问题,数据库系统使用锁来确保同一时刻只有一个事务能够对特定资源进行写入操作。
二、锁的类型及作用
2.1 行级锁
行级锁分为共享锁和排他锁,行级锁的优势在于它可以提供更细粒度的并发控制,从而提升系统并发性能和资源利用率,尤其是在高并发读写场景下。但是过于频繁的行级锁定也会带来一定的开销。
2.2 间隙锁与临键锁
间隙锁和临键锁是为了解决并发事务环境下可能导致的数据不一致问题而引入的特殊锁定机制。间隙锁不是锁定实际的数据行,而是锁定索引记录之间的空隙,例如在一个索引列值50和100的两个相邻记录之间有一个间隙,那么如果一个事务对这个间隙加了间隙锁,其他事务将不能在这个区间内插入新的记录,这样可以防止幻读现象的发生。
临键锁是间隙锁和行锁的组合,它不仅锁定数据行本身,还锁定该行前后的间隙。
2.3 共享锁与排他锁
共享锁是事务在读取数据时,它可以获得一个共享锁,多个事务可以同时对同一个数据对象加共享锁,即多个事务可以同时读取同一个数据项,但不能修改。持有共享锁的事务允许其他事务也获取共享锁,但不允许任何事务获得排他锁。
排他锁是当事务需要修改数据时,它会申请对数据对象加排他锁,一旦某个事务获得了数据项上的排他锁,其他任务事务都不能再对该数据项加任何类型的锁,包括共享锁。
2.4 意向锁
意向锁主要是为了提高锁定系统的效率和减少死锁的可能性,它们允许数据库系统快速确定是否有事务正在或者即将在表的某个部分上执行更新操作,而不需要遍历所有的行锁。
2.5 表级锁
使用表级锁的优势在于简单易用,但缺点是在高并发环境下可能导致性能瓶颈,多个事务可能需要等待同一表上的锁释放,从而降低了系统的并发处理能力。
2.6 元数据锁
元数据锁是防止并发的DDL操作之间以及DDL操作与数据操作语言DML操作之间发生冲突。在一个事务正在修改表机构的同时,其他事务不应执行影响同一张表的DDL或可能导致不一致结果的DML语句。元数据锁确保了在多线程或多用户环境下对表的元数据变更操作的一致性和完整性。
三、锁的管理与优化
3.1 合理设置事务隔离级别
根据业务需求选择合适的事务隔离级别,如读已提交、可重复读等,不同的隔离级别对锁的使用有不同的影响。
3.2 避免长事务
长事务会持有锁的时间更长,可能导致其他事务等待时间增加,引发死锁等问题。应尽量减少事务执行时间,或在设计上采用短事务。
3.3 索引优化
确保涉及更新操作的列有适当的索引,这样可以利用行级锁而非表级锁,提高并发性能。
3.4 明确锁定范围
在编写SQL时,尽量精确地指定锁定的目标范围,避免不必要的大范围锁定。
3.5 避免不必要的全表扫描
全表扫描可能导致隐式表锁或者大量间隙锁,如果能通过索引进行查询,则可以减少锁冲突。
四、实战分析
先准备一张表test_table,表结构如下

表中有数据,如下

4.1 行级锁验证
步骤1:启动两个客户端会话(Session A和Session B)


Session A已经对这行数据加了行级锁,所以Session B的更新语句将被阻塞,直到Session A提交或者回滚事务。
4.2 间隙锁和临键锁验证
Session A开始一个事务,锁定了一个不存在于现有数据范围内的间隙,在Session B中尝试插入一个落在Session A锁定间隙内的新行,Session B的插入操作将被阻塞,直到Session A提交或回滚其事务。


4.3 共享锁验证
Session A开始一个事务,并尝试对一行数据加上共享锁,Session B尝试更新同一行数据时,更新操作将会被阻塞,直到Session A提交或回滚事务。


五、总结
本文介绍了MySQL数据库的锁类型、管理优化以及验证了行级锁、间隙锁、共享锁,数据库的锁是确保在多线程或多用户环境下数据一致。
相关文章:
MySQL数据库的锁机制
目录 一、引言 二、锁的类型及作用 2.1 行级锁 2.2 间隙锁与临键锁 2.3 共享锁与排他锁 2.4 意向锁 2.5 表级锁 2.6 元数据锁 三、锁的管理与优化 3.1 合理设置事务隔离级别 3.2 避免长事务 3.3 索引优化 3.4 明确锁定范围 3.5 避免不必要的全表扫描 四、实战分…...
解决 conda新建虚拟环境只有一个conda-meta文件&conda新建虚拟环境不干净
像以前一样通过conda 新建虚拟环境时发现环境一团糟,首先新建虚拟环境 conda create -n newenv这时候activate newenv,通过pip list,会发现有很多很多的包,都是我在其他环境用到的。但诡异的是,来到anaconda下env的目…...
React16源码: React中的completeWork对HostText处理含更新的源码实现
HostText 1 )概述 在 completeWork 中 对 HostText的处理在第一次挂载和后续更新的不同条件下进行操作 第一次挂载主要是创建实例后续更新其实也是重新创建实例 2 )源码 定位到 packages/react-reconciler/src/ReactFiberCompleteWork.js#L663 到 c…...
网络协议与攻击模拟_07UDP协议
一、简单概念 1、UDP协议简介 UDP(用户数据报)协议,是传输层的协议。不需要建立连接,直接发送数据,不会重新排序,不需要确认。 2、UDP报文字段 源端口目的端口UDP长度UDP校验和 3、常见的UDP端口号 5…...
生命在于折腾——WeChat机器人的研究和探索
一、前言 2022年,我玩过原神,当时看到了云崽的QQ机器人,很是感兴趣,支持各种插件,查询游戏内角色相关信息,当时我也自己写了几个插件,也看到很多大佬编写的好玩的插件,后来因为QQ不…...
融资项目——EasyExcel将Excel文件保存至数据库
上一篇博客已经基本介绍了EasyExcel的配置与基本使用方法。现在准备使用EasyExcel将Excel文件保存至数据库。 1.由于我们想每读取Excel中的N条记录后将这些记录全部写入数据库中。所以首先我们在Mybatis文件内先要写一个批量保存Excel文件中的记录的sql语句。 <insert id&q…...
【Oracle】设置FGA(Fine-Grained Audit)细粒度审计
文章目录 【Oracle】设置FGA(Fine-Grained Audit)细粒度审计参考 【声明】文章仅供学习交流,观点代表个人,与任何公司无关。 编辑|SQL和数据库技术(ID:SQLplusDB) 收集Oracle数据库内存相关的信息 【Oracle】ORA-32017和ORA-00384错误处理 【Oracle】设…...
js vue调用activex ocx
js vue调用activex ocx 与IE调用方式不同处 CLSID和TYPE <OBJECT id"MultiplyDemo" refocx1 CLSID"{8EEF7302-1FC8-4BA0-8EA5-EC29FDBCA45B}" TYPE"application/x-itst-activex" width15% height15%></OBJECT>//调用方式1 //或是 …...
Hbas简介:数据模型和概念、物理视图
文章目录 说明零 BigTable一 Hbase简介二 HBase 访问接口简介三 行式&列式存储四 HBase 数据模型4.1 HBase 列族数据模型4.2 数据模型的相关概念4.3 数据坐标 五 概念&物理视图 说明 本文参考自林子雨老师的大数据技术原理与应用(第三版)教材内容,仅供学习…...
uniapp css样式穿透
目录 前言css样式穿透方法不加css样式穿透的代码加css样式穿透的代码不加css样式穿透的代码 与 加css样式穿透的代码 的差别参考 前言 略 css样式穿透方法 使用 /deep/ 进行css样式穿透 不加css样式穿透的代码 <style>div {background-color: #ddd;} </style>…...
【立创EDA-PCB设计基础完结】7.DRC设计规则检查+优化与丝印调整+打样与PCB生产进度跟踪
前言:本文为PCB设计基础的最后一讲,在本专栏中【立创EDA-PCB设计基础】前面已经将所有网络布线铺铜好了,接下来进行DRC设计规则检查优化与丝印调整打样与PCB生产进度跟踪 目录 1.DRC设计规则检查 2.优化与丝印调整 1.过孔连接优化 2.泪滴…...
android 线程池的管理工具类
封装了各种类型的线程池,方便直接使用 看下有哪些类型: 默认线程池,搜索模块专用线程池,网络请求专用线程池,U盘更新,同步SDK读写操作线程池,日志打印使用线程池 DEFALUT,SEARCH&…...
编码风格之(5)GNU软件编码风格(3)
GNU软件编码标准风格(3) Author:Onceday Date: 2024年1月21日 漫漫长路,才刚刚开始… 本文主要翻译自《GNU编码标准》(GNU Coding Standards)一文。 参考文档: Linux kernel coding style — The Linux Kernel documentationGNU Coding Standard…...
8 种网络协议
什么是网络协议? 网络协议就是计算机之间沟通的语言,为了有效地交流,计算机之间需要一种共同的规则或协议,就像我们和老外沟通之前,要先商量好用哪种语言,要么大家都说中文,要么大家都说英语&a…...
Flash读取数据库中的数据
Flash读取数据库中的数据 要读取数据库的记录,首先需要建立一个数据库,并输入一些数据。数据库建立完毕后,由Flash向ASP提交请求,ASP根据请求对数据库进行操作后将结果返回给Flash,Flash以某种方式把结果显示出来。 …...
如何写出规范优雅的代码
编码规范是成为一个优质程序员的重要一课,它是编程的样式的模板。这篇文章将介绍12中编程规范及技巧,相信学习之后你的代码一定会提升一个档次。 首先我们要明确,为什么要遵循编码规范?遵循这样的约定有什么好处? 遵循…...
【数据结构】链表(单链表与双链表实现+原理+源码)
博主介绍:✌全网粉丝喜爱、前后端领域优质创作者、本质互联网精神、坚持优质作品共享、掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战✌有需要可以联系作者我哦! 🍅附上相关C语言版源码讲解🍅 ὄ…...
14027.ptp 控制流
文章目录 1 ptp 控制流1.1 控制流分层 1 ptp 控制流 1.1 控制流分层 大体分为4层:1 ptp4l层: 获取配置文件、创建时钟、poll监控文件描述符。2 clock时钟层:提供提供clock_poll、clock_create、clock_sync 等3 port 端口层:port…...
【昕宝爸爸小模块】深入浅出之为什么POI的SXSSFWorkbook占用内存更小
➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你👍点赞、🗂️收藏、加❤️关注哦。 本文章CSDN首发,欢迎转载,要注明出处哦! 先感谢优秀的你能认真的看完本文&…...
CentOS安装Flume
CentOS安装Flume 一、简介二、安装1、下载2、解压3、创建配置文件4、启动flume agent5、验证 一、简介 Flume is a distributed, reliable, and available service for efficiently collecting, aggregating, and moving large amounts of log data. It has a simple and flexi…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
