MySQL锁三部曲:临键、间隙与记录的奇妙旅程

news2024/10/3 4:35:45

欢迎来到我的博客,代码的世界里,每一行都是一个故事


在这里插入图片描述

MySQL锁三部曲:临键、间隙与记录的奇妙旅程

    • 前言
    • 临键锁的奥秘
    • 间隙锁
    • 记录锁

前言

在数据库世界中,锁是维护数据完整性的一种关键机制。而MySQL中的临键锁、间隙锁和记录锁则是锁定数据的三大法宝。本文将引领读者进入这场锁的盛宴,深刻理解这三种锁的独特作用,以及如何在实际应用中灵活运用它们。

临键锁的奥秘

临键锁(Next-Key Locks)是很独特的一种锁,直观上来说可以看做是一个记录锁和间隙锁的组合。也就是说临键锁不仅仅是会用记录锁锁住命中的记录,也会用间隙锁锁住记录之间的空隙。临键锁和数据库隔离级别的联系最为紧密,它可以解决在可重复读隔离级别之下的幻读问题。间隙锁是左开右开,而临键锁是左开右闭。在数据库中,“临键锁"通常指的是"临键锁定”(Row-level lock),这是一种锁定记录的机制,确保对特定记录的独占访问。以下是临键锁的基本概念以及在数据库中如何使用它来确保对特定记录的独占访问:

基本概念:

  1. 行级锁: 临键锁是行级锁的一种,它锁定表中的特定行而不是整个表。

  2. 锁粒度: 行级锁允许并发事务在表中的不同行上工作,从而提高系统的并发性。

  3. 锁的状态: 临键锁可以处于不同的状态,包括共享锁(Shared Lock)和独占锁(Exclusive Lock)。

  4. 共享锁和独占锁:

    • 共享锁: 允许多个事务同时获取锁,用于读取操作,表示事务不会修改数据。
    • 独占锁: 只允许一个事务获取锁,用于写入操作,表示事务可能修改数据。

在数据库中如何使用临键锁:

  1. SELECT语句中的共享锁:

    • 当事务执行SELECT语句时,可以使用共享锁来确保其他事务不会在相同的记录上执行写操作。
    • 通过使用SELECT … FOR SHARE语法,事务可以获取共享锁。
    SELECT * FROM your_table WHERE your_condition FOR SHARE;
    
  2. UPDATE和DELETE语句中的独占锁:

    • 当事务执行UPDATE或DELETE语句时,可以使用独占锁来确保其他事务不会同时修改或删除相同的记录。
    • 通过使用UPDATE或DELETE语句时的FOR UPDATE语法,事务可以获取独占锁。
    UPDATE your_table SET your_column = 'new_value' WHERE your_condition FOR UPDATE;
    
  3. INSERT语句中的独占锁:

    • 当事务执行INSERT语句时,可以使用独占锁来确保其他事务不会同时在相同的记录位置插入数据。
    • 通过使用INSERT … ON DUPLICATE KEY UPDATE或INSERT IGNORE语句时的FOR UPDATE语法,事务可以获取独占锁。
    INSERT INTO your_table (your_columns) VALUES (your_values) ON DUPLICATE KEY UPDATE your_column = 'new_value' FOR UPDATE;
    

通过合理使用临键锁,可以在多个并发事务中确保对数据库表中特定记录的独占访问,从而维护数据的一致性和完整性。需要注意的是,过度使用锁可能导致性能问题,因此在设计和优化时需要权衡并考虑具体的业务场景。

间隙锁

间隙锁的作用:

间隙锁(Gap Lock)是一种在数据库中用于锁定一个范围而不是单个记录的锁。其作用在于:

  1. 确保范围内没有新数据插入: 通过使用间隙锁,可以确保在一个范围内没有新的记录被插入,从而避免并发事务在同一个范围内插入新的数据。

  2. 防止幻读: 间隙锁也可以防止幻读,即在同一个范围内确保其他事务不会插入新的记录,防止当前事务读到其他事务插入的未提交数据。

在并发操作中如何使用间隙锁:

考虑以下情境,使用间隙锁来避免不可预知的问题:

  1. 事务1:

    START TRANSACTION;
    SELECT * FROM your_table WHERE your_column BETWEEN 10 AND 20 FOR UPDATE;
    
  2. 事务2:

    START TRANSACTION;
    -- 此时间隙锁会锁定范围 [10, 20],防止其他事务插入新数据
    INSERT INTO your_table (your_column) VALUES (15);
    COMMIT;
    
  3. 事务1:

    -- 在此时,事务1再次执行相同的查询
    SELECT * FROM your_table WHERE your_column BETWEEN 10 AND 20 FOR UPDATE;
    

在上述例子中,如果没有间隙锁,事务1的第二次查询可能会读到事务2插入的新数据,导致不可预知的结果。通过使用FOR UPDATE和间隙锁,可以确保事务1在范围 [10, 20] 内的查询结果不会被其他事务插入新数据所影响。

需要注意的问题:

  1. 性能开销: 使用间隙锁可能会增加性能开销,因为它限制了其他事务在相同范围内插入数据。

  2. 并发控制: 间隙锁在一些情况下可能导致并发控制的降低,因此在设计时需要权衡并考虑具体的业务场景。

  3. 事务隔离级别: 间隙锁的行为可能会受到事务隔离级别的影响,需要谨慎选择适当的隔离级别。

在并发操作中,使用间隙锁能够确保对特定范围内的记录进行独占性操作,从而维护数据的一致性和完整性。

记录锁

记录锁(Row-level lock)是一种锁定数据库表中单个记录的机制。它在事务中的实际应用场景中发挥关键作用,可以保护数据的完整性。以下是记录锁的实际应用场景以及在事务中如何使用记录锁的详细讨论:

实际应用场景:

  1. 更新操作:

    • 当一个事务要对某个记录进行更新时,可以使用记录锁确保其他事务不能同时修改相同的记录,防止并发更新导致数据不一致。
    -- 事务1
    START TRANSACTION;
    SELECT * FROM your_table WHERE your_condition FOR UPDATE;
    -- 执行更新操作
    UPDATE your_table SET your_column = 'new_value' WHERE your_condition;
    COMMIT;
    
    -- 事务2
    START TRANSACTION;
    SELECT * FROM your_table WHERE your_condition FOR UPDATE; -- 会等待事务1释放锁
    -- 执行更新操作
    UPDATE your_table SET your_column = 'another_value' WHERE your_condition;
    COMMIT;
    
  2. 插入操作:

    • 当一个事务要在某个范围内插入新记录时,可以使用记录锁防止其他事务在相同范围内插入数据,避免幻读问题。
    -- 事务1
    START TRANSACTION;
    SELECT * FROM your_table WHERE your_column BETWEEN 10 AND 20 FOR UPDATE;
    -- 执行插入操作
    INSERT INTO your_table (your_column) VALUES (15);
    COMMIT;
    
    -- 事务2
    START TRANSACTION;
    SELECT * FROM your_table WHERE your_column BETWEEN 10 AND 20 FOR UPDATE; -- 会等待事务1释放锁
    -- 执行插入操作
    INSERT INTO your_table (your_column) VALUES (18);
    COMMIT;
    
  3. 删除操作:

    • 当一个事务要删除某个记录时,可以使用记录锁确保其他事务不能同时访问和修改相同的记录。
    -- 事务1
    START TRANSACTION;
    SELECT * FROM your_table WHERE your_condition FOR UPDATE;
    -- 执行删除操作
    DELETE FROM your_table WHERE your_condition;
    COMMIT;
    
    -- 事务2
    START TRANSACTION;
    SELECT * FROM your_table WHERE your_condition FOR UPDATE; -- 会等待事务1释放锁
    -- 执行其他操作
    COMMIT;
    

注意事项:

  1. 记录锁是通过使用FOR UPDATE语句实现的,它会锁定查询结果集中的行,防止其他事务在同一行上执行写操作。

  2. 记录锁的使用需要谨慎,过度使用可能导致性能问题,因此在设计时需要根据实际情况进行权衡。

  3. 事务隔离级别的选择会影响记录锁的行为,需要根据业务需求选择合适的隔离级别。

  4. 记录锁的释放通常发生在事务提交时,因此事务的持有时间应该尽量短,以减小锁的粒度和持有时间。

在事务中使用记录锁可以确保并发事务对数据库表中的记录进行独占性操作,从而维护数据的完整性。

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

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

相关文章

2024.2.25 -ElasticSearch 进阶

倒排索引 Elasticsearch的倒排索引机制是通过将文档中出现的词汇与它们所在的文档ID关联起来,实现快速查找包含特定词汇的文档。下面是一个具体的例子来说明倒排索引的工作原理: 假设我们有一个简单的文章集合,包含以下三篇文章&#xff1a…

pytorch 用F.normalization的逆归一化如何操作

逆归一化的时候再把这个数乘回去就行了 magnitude a.norm(p2, dim1, keepdimTrue) # NEW atorch.nn.functional.normalize(a, p2, dim1) a_or a* magnitude # NEW print(a_or) Outputs: tensor([]1,2,3)

springboot网站开发02-接入持久层框架mybatisPlus

springboot网站开发02-接入持久层框架mybatisPlus!经过上一小节内容分享,我们的项目嵌套模式框架搭建好了,下面就是开始编辑具体的业务代码了,我们使用到了持久层框架是mybatisPlus插件。下面是一些具体的植入框架的操作步骤。 第…

【Java程序员面试专栏 算法思维】二 高频面试算法题:二分查找

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊二分查找,包括基础二分,寻找目标值的左右边界,搜索旋转数组以及波峰,以及x的平方根问题,所以放到一篇Blog中集中练习 题目关键字解题思路时间空…

【MySQL面试复习】索引创建的原则有哪些?

系列文章目录 在MySQL中,如何定位慢查询? 发现了某个SQL语句执行很慢,如何进行分析? 了解过索引吗?(索引的底层原理)/B 树和B树的区别是什么? 什么是聚簇索引(聚集索引)和非聚簇索引…

MAC M1 安装mongodb7.0.5 版本

1、进入官网 Download MongoDB Community Server | MongoDBDownload MongoDB Community Server non-relational database to take your next big project to a higher level!https://www.mongodb.com/try/download/community 2、选择版本 3、下载后解压 放到 /usr/local 并修改…

好狄空气能热水器成功上榜2023年消费者心中的十大信赖品牌

随着环保意识的增强和能源消耗的持续关注,空气能热水器以其高效节能、绿色环保的特性赢得了越来越多消费者的青睐。市场上琳琅满目的空气能热水器品牌让消费者在选择时既兴奋又困惑。究竟哪些品牌能在激烈的竞争中脱颖而出,成为消费者心目中的佼佼者呢&a…

MongoDB之客户端工具与核心概念及基本类型篇

MongoDB之客户端工具与核心概念及基本类型篇 文章目录 MongoDB之客户端工具与核心概念及基本类型篇1. MongoDB是什么?1. 关于MongoDB2. 相关客户端工具1. MongoDB Compass2. Studio 3T3. Navicat for MongoDB4. NoSQL Manager for MongoDB Professional 2.MongoDB相关概念2.1 …

RabbitMQ实战学习

RabbitMQ实战学习 文章目录 RabbitMQ实战学习RabbitMQ常用资料1、安装教程2、使用安装包3、常用命令4、验证访问5、代码示例 一、RabbitMQ基本概念1.1. MQ概述1.2 MQ 的优势和劣势1.3 MQ 的优势1. 应用解耦2. 异步提速3. 削峰填谷 1.4 MQ 的劣势1.5 RabbitMQ 基础架构1.6 JMS 二…

钡铼lora智能网关终端节点温湿度无线采集4G远传

钡铼LoRa智能网关终端节点是一种用于温湿度无线采集和4G远传的设备,它能够实现远程监测和数据传输,适用于各种应用场景,包括工业、农业、环境监测等领域。在设置钡铼LoRa智能网关终端节点时,我们需要考虑到设备的功能特点、网络连…

C++ 入门(六)— 调试程序(Debugging)

文章目录 语法和语义错误调试(Debugging)调试过程调试策略常用的调试策略更多调试策略 使用集成调试器步进(Stepping) 语法和语义错误 语法错误 编写根据 C 语言的语法无效的语句时,会发生语法错误。例如缺少分号、使用未声明的变量、括号或…

字符函数和字符串函数(C语言进阶)(三)

目录 前言 接上篇: 1.7 strtok 1.8 strerror 1.9 字符分类函数 总结 前言 C语言中对字符和字符串的处理是很频繁的,但是c语言本身是没有字符串类型的,字符串通常放在常量字符串中或着字符数组中。 字符串常量适用于那些对它不做修改的字…

生成式 AI - Diffusion 模型的数学原理(5)

来自 论文《 Denoising Diffusion Probabilistic Model》(DDPM) 论文链接: https://arxiv.org/abs/2006.11239 Hung-yi Lee 课件整理 讲到这里还没有解决的问题是,为什么这里还要多加一个噪声。Denoise模型算出来的是高斯分布的均…

根据前序后序遍历求出二叉树

根据前序后序遍历求出二叉树 一、题目描述 给定两个整数数组,preorder 和 postorder ,其中 preorder 是一个具有 无重复 值的二叉树的前序遍历,postorder 是同一棵树的后序遍历,重构并返回二叉树。 二、题目分析 需求&#xff…

成都直播基地作为产业重要载体,引领直播行业健康、多元发展

近年来,我国网络直播行业呈现出井喷式的发展态势。众多直播平台如雨后春笋般涌现,直播内容丰富多样,涵盖游戏、电竞、美食、旅游、教育等多个领域。同时,成都直播产业园规模持续扩大,产业不断完善,整体呈现…

如何在Win系统搭建Oracle数据库并实现远程访问【内网穿透】

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle,是甲骨文公司的一款关系…

基于Java SSM框架实现高考填报信息系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现高考填报信息系统演示 JAVA简介 Java主要采用CORBA技术和安全模型,可以在互联网应用的数据保护。它还提供了对EJB(Enterprise JavaBeans)的全面支持,java servlet API,JSP(java serv…

【前沿热点视觉算法】-带有信道坐标注意特征融合模块的双光谱语义分割网络

计算机视觉算法分享。问题或建议,请文章私信或者文章末尾扫码加微信留言。 1 论文题目 带有信道坐标注意特征融合模块的双光谱语义分割网络 2 论文摘要 双光谱(RGB-hehtir)语义分割是在恶劣成像环境(如黑暗、雨、雾&#xff09…

SpringCloud Alibaba 2022之Nacos学习

SpringCloud Alibaba 2022使用 SpringCloud Alibaba 2022需要Spring Boot 3.0以上的版本,同时JDK需要是17及以上的版本。具体的可以看官网的说明。 Spring Cloud Alibaba版本说明 环境搭建 这里搭建的是一个聚合项目。项目结构如下: 父项目的pom.xm…

还不知道随身WiFi这个蓝海市场怎么做?这个一定要看!适合30-40岁轻资产小生意

有没有发现你身边的人最近都在失业?无论是国企的、事业编的、又或者是民营企业的都在欠薪或者失业,看来经济寒潮是真的来了。虽然经济大环境不好,但是仍然涌现出了物联网、人工智能、大数据等新兴的蓝海市场。可是很多创投圈的朋友都表示&…