MySQL行锁浅析

news2024/11/25 1:07:19

在这里插入图片描述

概述

MySQL是非常流行的关系型数据库,许多系统都使用它来存储和管理数据。在高并发环境下,为了保证数据的一致性和可靠性,数据库需要实现并发控制,其中包括锁机制。MySQL提供了两种锁类型,一种是表级锁,另一种是行级锁。本文将深入探讨MySQL中的行级锁,包括行锁概念,行锁实现原理、类型、使用场景等。

行锁基础概念

1、行锁概念

MySQL中的行锁是一种细粒度锁,它可以确定需要锁定的数据是哪一条记录,从而保证了不同线程对同一数据的访问的隔离性。行锁可以控制读写并发访问过程中的数据一致性,但它的粒度较小,需要更频繁地加锁和解锁,比较消耗资源。

2、行锁实现原理

MySQL行锁的实现原理是基于索引,这是因为MySQL有一个规则:只有在使用索引条件检索数据时才会使用行级锁。这意味着如果进行全表扫描等操作就无法使用行级锁了。

MySQL在执行SELECT语句时会根据WHERE子句的条件,找到要访问的记录。如果这个WHERE条件有索引,MySQL就会使用这个索引。

如果该索引是聚集索引,那么锁定该记录的时候就是锁定整个聚集索引。

如果该索引是非聚集索引,那么锁定该记录的时候就是锁定这个非聚集索引中的索引项。

行级锁会自动处理,并根据其中记录是否已经被锁定或锁定的类型去决定事务的并发度,当锁定行的事务提交后,事务自动释放锁定,其他事务就可以继续访问这些记录。

行锁类型

MySQL的行级锁使用了多种锁类型来实现,在这里我们将介绍三种常用的行锁类型及其应用场景。它们是:

1、共享锁(Shared lock)

共享锁,也称为读锁,是一种最常用的行级锁,用于控制读操作和写操作的并发性。当对数据进行读取时,MySQL会自动加上共享锁,可以允许多个线程同时读取同一个数据块,但不能同时进行写操作。

在 MySQL 中,可以通过以下方式获得共享锁:

SELECT ... FROM ... WHERE ... LOCK IN SHARE MODE;

这个语句会获取读锁,并且会等待其他持有共享锁的事务完成才会释放锁。通过添加这个 LOCK IN SHARE MODE 子句,可以确保在 SELECT 查询期间不会发生数据修改操作,从而避免并发问题。

另外,MySQL 还提供了 SELECT … FOR SHARE 语句,它也可以获取共享锁。但它的效果和 LOCK IN SHARE MODE 很不同。SELECT … FOR SHARE 是在事务开始时就获得共享锁,直到事务结束才释放锁。而 LOCK IN SHARE MODE 则只在执行查询时获得锁,并在查询完成后立即释放锁。

如果一个线程在一个数据块上已经有了共享锁,其他线程就只能再申请共享锁,而不能申请排它锁,因为该数据块正在被读取,而不能被修改。所以,共享锁可以被多个事务共享,但它不可以与其他的排它锁并存。在获取共享锁的情况下,其他事务依然可以读取数据,但是无法进行修改,直到释放锁,所以在并发读写场景下,仍需要考虑数据一致性问题。

2、排它锁(Exclusive lock)

MySQL 中排它锁(Exclusive lock)用于控制写操作的并发性,和共享锁恰恰相反。排它锁只能被一个事务持有,其他事务不能获得该锁。当一个事务持有排它锁时,其他事务既不能持有共享锁,也不能持有排它锁。

在 MySQL 中,可以通过以下方式获得排它锁:

SELECT ... FROM ... WHERE ... FOR UPDATE;

这个语句会获取写锁,并且会等待其他持有共享锁或排它锁的事务完成才会释放锁。通过添加 FOR UPDATE 子句,可以确保 SELECT 语句在事务中执行期间不会发生数据修改操作,从而避免并发问题。

需要注意的是,如果一条数据已经被其他事务持有排它锁,那么当前事务也不能对该数据获得排它锁。并发写入操作需要考虑如何控制事务的执行顺序,使得数据可以在一定程度上避免竞争条件,保证数据的正确性和完整性。

3、意向锁(Intention lock)

MySQL中的Intention Lock(意向锁)主要用于协调读锁和写锁之间的关系。它是一种锁级别,在事务并发控制中发挥着重要作用。Intention Lock有两种:Intention Share Lock(IS)和Intention Exclusive Lock(IX)。

当一个事务要对一行数据进行读操作(使用SELECT语句),它会请求一个IS锁。如果一个事务请求在一个表上请求了一个IS锁,则表示它想要对此表的某些行进行读操作,但是它不需要排它锁,多个事务可以同时持有IS锁。

当一个事务要对一行数据进行写操作(使用UPDATE或DELETE语句),它会请求一个IX锁。如果一个事务请求在一个表上请求一个IX锁,则表示它想对此表的某些行进行修改,要求其他事务不能进行读/写操作,只有自己可以修改,IX锁的排它性更强。

在MySQL中,允许多个事务同时持有IS锁,但是它不允许在同时持有IS锁的情况下持有IX锁,这是因为一个事务如果持有一个IX锁,则表示它想要对该行数据进行修改,其他事务不能进行读/写,因此如果允许持有IS锁的事务也持有IX锁,会导致其他事务无法进行读操作,从而违反了IS锁的共享性。

使用场景

在实际开发中,行锁的应用非常广泛,它可以解决在高并发访问下的数据一致性问题。

1、读写并发的场景

如果系统中对同一张表进行读写操作,为了保证数据的一致性,就必须考虑使用行锁。比如,在一个资金账户中,一个用户向该账户存款,同时另一个用户在从该账户中进行提款,为了避免这两个操作产生的并发问题,就必须使用行级锁保证数据的一致性。

2、数据操作的唯一性约束

使用行锁可以保证有唯一标识的数据只被一个事务修改,这样就保证了数据操作的唯一性。

3、对于需要操作较大表的场景

表级锁在操作大表时效率低下,会产生资源瓶颈,而使用行级锁就可以很好地解决这个问题,因为行级锁只会对访问的数据进行锁定,避免了对整张表的锁定。

锁的优化

1、减少锁的竞争

当多个线程同时想要获取同一条记录的时候,就会发生锁的竞争,这时候就需要考虑如何减少锁的竞争。

一种常用的方法是分库分表,将数据划分到不同的表或者不同的数据库中,这样可以有效地减少锁的竞争,提高并发性能。

另外一种方法是使用缓存,缓存可以减少对数据库的直接访问,从而减少锁的竞争。

2、合理使用锁类型

在使用行级锁的时候,需要根据实际情况选择不同的锁类型,避免出现无法获取到锁的情况。

对于读多写少的场景,可以使用共享锁来保证数据的一致性;

对于写多读少的场景,可以使用排它锁来保证数据的一致性;

而对于既有读操作又有写操作的场景,可以使用意向锁来保证数据的一致性,这样可以有效避免锁的竞争。

3、精简事务范围

尽量将事务的操作范围控制在最小范围内,可以有效减少锁冲突的机会,提高并发性能。尤其在更新大表时,可以针对一个分区或者一页进行处理,而不是锁定整个表。

总结

本文介绍了MySQL中行级锁的基础概念、实现原理、类型及其使用场景。MySQL行级锁是细粒度锁,可以保证不同线程对同一数据的访问的隔离性。行锁使用的锁类型多种多样,我们需要根据实际情况选择不同的锁类型,避免出现无法获取到锁的情况。通过使用行级锁,我们可以较好地解决高并发情况下的数据一致性问题,提高系统的并发性能。

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

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

相关文章

Java遍历Map集合,获取key、value等方式

首先构建一个Map集合&#xff1a; Map<String, Integer> buynew HashMap<>();buy.put("苹果手机", 2);//添加键值对buy.put("智能手表", 1);buy.put("java书", 1);buy.put("c语言书", 1);buy.put("西瓜", 2);打…

Git已经在本地提交过文件了,但又给撤销了,恢复已经撤销的内容

Git&#xff0c;我已经在本地提交过文件了&#xff0c;也就是已经执行了git commit -m "xxx"&#xff0c;但提交完之后又给撤销了&#xff0c;撤销的还能回来嘛&#xff1f; 这种情况仍然有机会恢复它。撤销提交的方法取决于你撤销提交的方式。 说白了就是&#xff0…

背景 | 基于 Transformers 的编码器-解码器模型

!pip install transformers4.2.1 !pip install sentencepiece0.1.95 Vaswani 等人在其名作 Attention is all you need 中首创了 基于 transformer 的编码器-解码器模型&#xff0c;如今已成为自然语言处理 (natural language processing&#xff0c;NLP) 领域编码器-解码器架构…

深度解读生命周期函数

目录 前言什么是生命周期&#xff1f;生命周期的流程创建组件初始化事件和生命周期初始化组件判断渲染结构的数据与模板生成HTML结构渲染HTML结构数据更新初步销毁组件销毁组件 生命周期函数beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestroydestroyed 前…

视觉SLAM数据集(二):EuRoC DataSet

本文展示了在微型飞行器&#xff08;MAV&#xff09;上收集的视觉惯性数据集。数据集包含立体图像、同步 IMU 测量以及精确的运动和结构地面实况。 这些数据集发表于&#xff1a;M. Burri&#xff0c;J. Nikolic&#xff0c;P. Gohl&#xff0c;T. Schneider&#xff0c;J. Reh…

运维监控Zabbix部署——详细图文讲解

运维监控Zabbix部署 简介 Zabbix 由 Alexei Vladishev 创建&#xff0c;目前由其成立的公司—— Zabbix SIA 积极的持续开发更新维护&#xff0c; 并为用户提供技术支持服务。 Zabbix 是一个企业级分布式开源监控解决方案。 Zabbix 软件能够监控众多网络参数和服务器的健康…

StarRocks案例2: 升级后性能变慢

文章目录 一. 问题描述二. 解决方案2.1 从慢查询定位2.2 定位CPU解析时间就的问题 一. 问题描述 2023-05-18 将StarRocks从2.3.0升级到2.5.5。 升级完成后&#xff0c;所有的查询均比较慢&#xff0c;前端报表页面点开也卡。 二. 解决方案 2.1 从慢查询定位 StarRocks慢查询…

智慧档案馆十防一体化建设主要设计依据

1、《中华人民共和国档案法》 2、《中华人民共和国档案实施办法》 3、GB/T 9386-1988《计算机软件测试文件编制规范》 4、GB/T 15532-1995《计算机软件单元测试规范》 5、GB/T 30961-2014 嵌入式软件质量度量 6、GB2421-89 电工电子产品基本环境试验规程 7、GB16796-2009…

阿里影业业绩:2023财年经调整EBITA盈利2.95亿元,同比增加106%

今年以来&#xff0c;社会经济加速恢复&#xff0c;影视业也在加速抓住市场机遇&#xff0c;走进电影院的佳作和消费者都在顺势增长。 5月31日&#xff0c;阿里影业&#xff08;01060&#xff09;发布2022/23财年业绩&#xff0c;得益于业务结构的多样化建设及运营效率的持续提…

调试代码可能会成为潜在的安全漏洞

有时候&#xff0c;我们不得不开发一些所谓的”调试用”代码。 但是&#xff0c;不要忘记了&#xff0c;虽然这些调试代码只是用来调试的&#xff0c;但是并不意味着我们就可以忽略掉安全性。 我记得&#xff0c;曾经有一位客户问过如下的问题&#xff1a; 我们正在开发一个后…

一文带你搞懂防盗链

防盗链 举个例子。我们平时在网上看到图片&#xff0c;觉得不错&#xff0c;想要复制地址。有的复制地址后我们可以拿来用&#xff0c;但是有的&#xff0c;就算是复制地址&#xff0c;用到我们自己的img上&#xff0c;还是没效果。 原因是&#xff0c;有的图片所在服务有自己…

跨境电商客户服务五步法

互联网技术的革新与升级对商务客服产生了巨大的影响&#xff0c;过去由在线客服与客户直接电联的单一服务形式被全渠道客服系统所替代。在电子商务时代&#xff0c;商家与客户之间的互动变得尤为重要&#xff1a;一方面&#xff0c;卖家通过分析客户喜好及消费趋向来针对性处理…

WhatsApp-跨境电商必争之地

作为世界上最受欢迎的即时通讯软件&#xff0c;WhatsApp在全球拥有超过20亿的月活跃用户&#xff0c;覆盖180多个国家&#xff0c;每天通过WhatsApp发送的消息数量超过了1000亿条。作为中国企业出海的热门国家&#xff0c;印度、巴西、美国、印尼...同时也是WhatsApp受众排名前…

数据在内存中的存储(2)——浮点数

目录 1、什么是浮点数 2、浮点数与整数存储方式相同吗&#xff1f; 3、浮点数的存储规则 3.1 、国际标准IEEE&#xff08;电气和电子工程协会&#xff09; 754 3.2、IEEE 754规定&#xff1a; 3.3、IEEE 754对有效数字M的规定。 3.4、IEE 754对有效数字E的规定 E不全为0或不全…

Day58【单调栈】739.每日温度、496.下一个更大元素 I

739.每日温度 力扣题目链接/文章讲解 视频讲解 暴力解法很容易想到。外层 for 遍历填充 answer&#xff0c;内层 for 针对每一天去寻找下一个更高温度 直接超时 本题可以采用单调栈解决&#xff01; 什么是单调栈&#xff1f; 从名字上就听的出来&#xff0c;单调栈中…

创建型设计模式05-抽象工厂模式

✨作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 抽象工厂模式 1、抽象工厂模式介绍 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是一种创建型设计模式&#x…

MATLAB按照曲线模型拟合数据

用到了曲线拟合工具箱&#xff0c;如果没有下载需要另外安装&#xff1a; 没有下载的话在命令行内输入cftool不会弹出窗口&#xff0c;而是提示没有这个命令 在菜单栏的APP&#xff1a; 点击获取更多APP&#xff1a; 在弹出的窗口输入Curve Fitting Toolbox 注意这里输入cft…

100种思维模型之多维视角思维模型-70

“多维视角思维模型”让我们用众生之眼看世界&#xff0c;继而看见更真实世界的思维模型。 01、何谓多维度视角思维模型 一、多维度视角 所谓多维视角&#xff0c;指的是除了用自己本能的视角看待问题&#xff0c;还会用360度其他人的视角&#xff0c;如对立面的视角&#xff…

仅用自然语言,让ChatGPT输出连贯的长篇小说!苏黎世联邦理工大学提出RecurrentGPT

夕小瑶科技说 原创 作者 | ZenMoore&#xff0c;Wangchunshu Zhou 前言 ChatGPT 是万能的吗&#xff1f; 显然不是&#xff0c;至少在今天我们所讨论的长文本生成上&#xff0c;ChatGPT 可以说是几乎完全不太可能生成长篇小说。 在某种程度上&#xff0c;这是 Transformer 模…

2自由度并联关节的制作

1. 运动功能说明 2自由度并联关节模组的主要运动方式为用舵机带动连杆摆动。 2. 结构说明 构成本模组的零部件主要是舵机&#xff08;行程0度~180度&#xff09;、舵机支架、舵机输出头、连杆、螺丝、螺母等。此模组的机械系统介绍及运动学算法讲解可参考【R306】5自由度并联机…