MySQL:行级锁

embedded/2024/10/18 18:27:14/

MySQL中的行级锁是数据库锁机制中粒度最细的一种,它只锁定事务需要修改的数据行,而不是整个表或数据库。行级锁能够显著提高数据库的并发性能,减少锁冲突。

行级锁的类型

MySQL中的行级锁主要有以下几种类型:

  1. 记录锁(Record Lock)

    • 直接锁定被操作的数据行。
    • 分为共享锁S锁)和排他锁X锁)。S锁允许其他事务读取被锁定的数据行,但不允许修改;X锁则不允许其他事务读取或修改被锁定的数据行。
    • 示例:SELECT * FROM your_table WHERE id=1 FOR UPDATE; 会对id为1的数据行加X锁。
  2. 间隙锁(Gap Lock)

    • 锁定一个范围,但不包括该范围内的任何实际数据记录。
    • 主要用于阻止其他事务在锁定数据范围内插入新数据,防止幻读现象的发生。
    • 只存在于可重复读(Repeatable Read)隔离级别。
    • 示例:在id为(3,5)的范围内加间隙锁,会阻止其他事务插入id为4的记录。
  3. 临键锁(Next-Key Lock)

    • 记录锁和间隙锁的组合,锁定一个范围并包括边界上的记录。
    • 防止其他事务在范围内插入新记录或修改被锁定的记录。
    • 只在可重复读或更高隔离级别下生效。
    • 示例:在id为(3,5]的范围内加临键锁,会阻止其他事务插入id为4的记录或修改id为5的记录。

行级锁的实现原理

MySQL中的InnoDB存储引擎支持行级锁,它是通过给索引项加锁来实现的。这意味着,只有通过索引条件来检索数据,才能使用行级锁;否则,将使用表级锁。行级锁的开销相对较大,但锁定粒度最小,能够显著提高数据库的并发性能。

行级锁的使用方式

显式获取行级锁

在 MySQL 中,使用 SELECT 语句时,通过使用 LOCK IN SHARE MODEFOR UPDATE 子句,可以在读取数据时实现共享锁和排他锁的锁定,以控制并发事务之间对数据的访问和更新,从而控制并发事务对数据的访问和更新。

显式锁定需要开发人员负责管理和释放锁定,避免出现死锁和性能问题。

共享锁

SELECT … LOCK IN SHARE MODE

当使用 SELECT 语句查询数据时,可以添加 LOCK IN SHARE MODE 子句来对查询结果集中的数据行进行共享锁(Shared Lock)的锁定。

共享锁允许其他事务并发地读取相同的数据,但阻止其他事务对数据行进行写操作,保证了读取的数据不会被修改。其他事务可以获取共享锁以读取数据,但等待写锁(Exclusive Lock)的事务无法进行写操作。

例如:

sql">SELECT * FROM table_name LOCK IN SHARE MODE;
排他锁

SELECT … FOR UPDATE:

当使用 SELECT 语句查询数据时,可以添加 FOR UPDATE 子句来对查询结果集中的数据行进行排他锁(Exclusive Lock)的锁定。

排他锁会阻止其他事务对数据行进行读取或写入操作,只有持有排他锁的事务可以进行数据的更新。其他事务在遇到已被锁定的数据行时,会进入等待状态,直到排他锁被释放。

例如:

sql">SELECT * FROM table_name FOR UPDATE;
隐式获取行级锁
  • 在执行 UPDATEDELETE 等修改数据的操作时,MySQL会自动为涉及的数据行加X锁(排他锁)。
  • 无需显式地使用锁语句,但需要注意事务的开启和提交。

注意事项

  1. 锁的粒度与并发性能:行级锁的粒度最小,但开销也最大。在设计数据库和查询时,应权衡锁的粒度与并发性能之间的关系。

  2. 死锁:当两个或多个事务相互等待对方释放锁时,会发生死锁。MySQL会自动检测并处理死锁,但过多的死锁会影响数据库的性能。

  3. 索引优化:合理使用索引可以提高行级锁的效率,减少锁的竞争。在设计数据库时,应优先考虑为经常查询的列添加索引。

  4. 事务隔离级别:不同的隔离级别会影响行级锁的行为。例如,在可重复读隔离级别下,InnoDB会使用临键锁来防止幻读现象的发生。

通过了解MySQL行级锁的类型、实现原理、使用方式以及注意事项,我们可以更好地利用行级锁来提高数据库的并发性能和数据一致性。


http://www.ppmy.cn/embedded/88927.html

相关文章

使用Micronaut构建高性能微服务

使用Micronaut构建高性能微服务 大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!Micronaut是一个现代化的Java框架,用于构建高性能、易于维护的微服务。它在设计时考虑了低内存消耗和快速启…

C#实现数据采集系统-系统优化服务封装

系统优化-服务封装 现在我们调用modbustcp和mqtt都直接在Program,所有加载和功能都混合在一起,比较难以维护 类似asp.net core项目的Program.cs代码如下,构建服务配置和启动 要实现的效果,Main方法中就是一个服务启动,只需要几行代码 分析代码 这里分成两部分,一…

k8s笔记之创建Istio Gateway规则

创建Istio Gateway 背景如何创建Istio Gateway规则配置方式rewrite重写路径直接去除match,默认都转发到一个服务路由规则多种配置方式实践(即开头的完整版) 涉及的命令补充注意事项 背景 为什么需要使用到Istio Gateway?充当k8s服…

vulhub:nginx解析漏洞CVE-2013-4547

此漏洞为文件名逻辑漏洞,该漏洞在上传图片时,修改其16进制编码可使其绕过策略,导致解析为 php。当Nginx 得到一个用户请求时,首先对 url 进行解析,进行正则匹配,如果匹配到以.php后缀结尾的文件名&#xff…

springCloud组件专题(五) --- seata

一.Seata介绍 1. seata是什么 是一款开源的分布式事务解决方案,供了 AT、TCC、SAGA 和 XA 事务模式。 2.分布式事务中的概念 2.1. 二阶段提交 二阶段提交的含义就是将事务的提交分成两个步骤,分别为: 准备阶段:事务协调者询问所…

JAVA基础知识点3 (String 和 StringBuffer 以及 StringBuilder 的特点以及区别)

1,String 和 StringBuffer 以及 StringBuilder 的特点 (1)String的特点:String是final修饰的字符序列是不可改变的, 是字符串常量,一旦初始化就不可以被更改,因此是线程安全的 因为是常量每次对其操作都会…

利用开源可视化报表工具进入流程化办公!

很多客户朋友都希望能实现流程化办公,因为只有这样才能帮助企业顺利降本、增效、提质,利用好企业内部数据资源,打破信息孤岛壁垒,实现高效发展。低代码技术平台、开源可视化报表工具优势功能特点多,是提质高效的办公利…

mac|运行别人的SpringBoot+Vue项目

一、运行vue 1、查看项目版本,在package.json中查看,在dependencies中的vue就是对应的版本 2、查看本机的vue版本:vue -V 3、删除node_modules 、package-lock.json 4、运行npm install 如果卡住不动,可能是因为网络问题&…