MySQL数据库的锁机制

news2024/12/24 8:03:35

目录

一、引言

二、锁的类型及作用

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数据库的锁类型、管理优化以及验证了行级锁、间隙锁、共享锁,数据库的锁是确保在多线程或多用户环境下数据一致。

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

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

相关文章

SpringBoot+beetl idea热更新解决方案

SpringBootbeetl idea热更新解决方案 第一在application中开启: beetl:resource-auto-check: true #热加载beetl模板,开发时候用第二在application中开启: devtools: 这个部分专门用于配置Spring Boot DevTools的相关参数。DevTools…

基于springboot+vue的“衣依”服装销售平台系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

【latex】在Overleaf的IEEE会议模板中,快速插入参考文献

【LaTeX】在Overleaf的IEEE会议模板中,快速插入参考文献 写在最前面第一步:在文献检索网站导出引用文献的bib文件第二步:编辑overleaf模版方法二:EduBirdie生成参考文献(补充)使用LaTeX在Overleaf的IEEE会议…

Spring 声明式事务 @Transactional(详解)【面试重点,小林出品】

关于 Transactional 注解的基本使用,推荐看Spring 声明式事务 Transactional(基本使用) 概述 本篇博客主要学习 Transactional 注解当中的三个常⻅属性: 1. rollbackFor:异常回滚属性.指定能够触发事务回滚的异常类型.可以指定多个异常类型 …

Goby 漏洞发布|GoAnywhere MFT InitialAccountSetup.xhtml 绕过漏洞(CVE-2024-0204)

漏洞名称:GoAnywhere MFT InitialAccountSetup.xhtml 绕过漏洞(CVE-2024-0204) English Name:GoAnywhere MFT InitialAccountSetup.xhtml Bypass Vulnerability (CVE-2024-0204) CVSS core: 9.8 影响资产数: 4468 …

微信小程序如何获取当前日期时间

Hello大家好!我是咕噜铁蛋,获取当前日期时间是小程序中经常会用到的一个功能。因此,在本文中,我通过科技手段给大家收集整理了下,今天我将向大家介绍如何在微信小程序中获取当前日期时间的方法,并分享一些实…

【项目搭建三】SpringBoot引入redis

添加依赖 本文使用spring data redis访问和操作redis&#xff0c;pom文件中加入以下依赖&#xff1a; <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </depende…

java开发——《并发编程》

目录 一.jmm 二.并发了什么 1.只有一个核&#xff08;单核&#xff09;并发还有没有意义 2.单核&#xff0c;还有什么可见性问题 3.并发和并行 三.volitaile 1.变量的可见性问题 2.原因是什么 3.本次修改的变量直接刷到主内存 4.声明其他内存对于这个地址的缓存无效 …

Linux:gcc的相关知识

目录 gcc的翻译&#xff08;编译&#xff09;过程&#xff1a; 预处理&#xff1a; 条件编译&#xff1a; 编译&#xff1a; 汇编&链接&#xff1a; 什么是链接&#xff1f; 安装静态库&#xff1a; 静态库的使用&#xff1a; 动态静态的对比&#xff1a; 优缺对比…

HCIE之BGP基础练习(二)

BGP 一、BGP报文和状态机1.EBGP 建立邻居仅需一条命令2.IBGP之间建立邻居只需要三条命令3.EBGP之间用回环口建立邻居需要三条命令4.下一跳5.宣告路由6.full-math邻居7.路由反射器 一、BGP报文和状态机 1.EBGP 建立邻居仅需一条命令 [AR1]bgp 100 [AR1-bgp]router-id 1.1.1.1 […

Qt5项目拆解第一集解决:中文乱码| 全局字体|注册表|QSS/CSS

# 一、乱码解决代码片段 QTextCodec是Qt中用于处理文本编码和字符集转换的类。它提供了一系列静态函数来实现不同编码的文本转换,包括编码转换、字符集检测和转换、以及数据流中的文本编码处理。QTextCodec类使得Qt可以在不同的编码和字符集之间进行无缝转换,从而方便地处理…

帮你找到99%的电子书,这46个免费电子书网站,你还不知道吗?

国内网站&#xff1a;32个 1鸠摩搜书 网址&#xff1a;https://www.jiumodiary.com/ 一个强大的搜书神站&#xff0c;无论是什么类型的书籍&#xff0c;只要你知道书名&#xff0c;就可以轻松的搜到你想要书籍。页面简单明了&#xff0c;书籍种类繁多&#xff0c;格式多种多样…

linux修改文件夹下所有文件的权限(常用)

1、 修改文件夹下所有文件的权限 # filename为要修改的文件夹名字。-R应该是表示递归修改filename文件夹下所有文件的权限 sudo chmod -R 777 filename2、linux修改单个文件夹权限 sudo chmod 600 &#xff08;只有所有者有读和写的权限&#xff09; sudo chmod 644 &#…

基于sentinel-2 遥感数据的水体提取(水体指数法)

本文框架设置如下&#xff1a; 简单介绍senintel-2数据&#xff1b;如何利用sentinel-2数据获取水体边界/范围 1 Sentinel-2数据介绍及下载方式 有Sentinel-2A/2B两颗卫星&#xff0c;其参数基本一致&#xff0c;因此两颗卫星的数据联合使用很方便。 分辨率有&#xff1a;1…

助力医疗数字化转型,贝锐x医百科技案例解析

在医疗数字化这个历史进程的大浪潮中&#xff0c;医药企业扮演着重要的角色&#xff0c;其重要程度恐怕仅次于医疗机构本身。同时&#xff0c;数字化转型对于医药企业的赋能作用也是十分明显的&#xff0c;尤其在营销端&#xff0c;一系列的数字化管理、数字化推广方案已经成为…

前端开发中的那些规范

开发中的那些规范 俗话说&#xff1a;无规矩不成方圆。生活如此、软件开发也如此。 来聊一聊开发中有哪些地方需要规范。 为什么需要规范 现在开发一个应用基本上都是多人协作&#xff0c;一旦涉及到多人&#xff0c;必然不同的开发者的开发习惯、编码方式都是有所不同的&…

常用电子器件学习——三极管

三极管介绍 三极管&#xff0c;全称应为半导体三极管&#xff0c;也称双极型晶体管、晶体三极管&#xff0c;是一种电流控制电流的半导体器件其作用是把微弱信号放大成幅度值较大的电信号&#xff0c; 也用作无触点开关。晶体三极管&#xff0c;是半导体基本元器件之一&#xf…

NAT地址转换协议

目录 NAT应用场景静态NAT动态NATNAPTEasy IPNAT服务器 点击跳转NAT配置&#xff08;动态nat&#xff0c;静态nat&#xff0c;Easy IP&#xff09; NAT应用场景 - 随着网络设备的数量不断增长&#xff0c;对IPv4地址的需求也不断增加&#xff0c;导致可用IPv4地址空间逐渐耗尽…

2023蓝帽杯初赛取证

排名&#xff1a;37 取证检材容器密码&#xff1a;Hpp^VFQ6bdWYKMjXgUPG#hHxw!jM9 案件详情 2021年5月&#xff0c;公安机关侦破了一起投资理财诈骗类案件&#xff0c;受害人陈昊民向公安机关报案称其在微信上认识一名昵称为yang88的网友&#xff0c;在其诱导下通过一款名为维…