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

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


在这里插入图片描述

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.hqwc.cn/news/491492.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab倒立摆小车LQR控制动画

1、内容简介 略 54-可以交流、咨询、答疑 2、内容说明 略 摆杆长度为 L,质量为 m 的单级倒立摆(摆杆的质心在杆的中心处),小车的质量为 M。在水平方向施加控制力 u,相对参考系产生位移为 y。为了简化问题并且保其实质不变,忽…

快速启动-后台管理系统

目录 Gitee人人开源 后端快速启动 1.clone仓库到本地 2.初始化数据库 3.更改数据库连接 4.启动项目验证 前端快速启动 1.克隆仓库 2.vsCode打开 3.控制台npm install 4.验证测试 时代已然不同,后台管理也可以使用脚手架方式快速启动。 Gitee人人开源 地…

QT GUI编程常用控件学习

1 GUI编程应该学什么 2 QT常用模块结构 QtCore: 包含了核心的非GUI的功能。主要和时间、文件与文件夹、各种数据、流、URLs、mime类文件、进程与线程一起使用 QtGui: 包含了窗口系统、事件处理、2D图像、基本绘画、字体和文字类 QtWidgets: 包含了一些列创建桌面应用的UI元素…

InnoDB中的索引类型以及为什么使用

InnoDB中的索引类型? InnoDB存储引擎支持两种常见的索引数据结构:B树索引、Hash索引,其中B树索引是目前关系型数据库系统中最常见、最有效的索引。 数据库中的B树索引分为聚集索引和非聚集索引。聚集索引就是按照每张表的主键构造一个B树&am…

HuggingFists系统功能介绍(2)--数据源账号

数据源 再次,我们进入“数据源”管理模块。该模块用于管理我们在进行数据处理或分析时所需要的所有数据源。在定义任何的数据流程读写工作之前,必须先通过数据源管理模块创建出对应的数据源。数据源可以是我们需要进行数据处理时,原始数据所在…

做接口测试的流程一般是怎么样的?UI功能6大流程、接口测试8大流程这些你真的全会了吗?

在讲接口流程测试之前,首先需要给大家申明下:接口测试对于测试人员而言,非常非常重要,懂功能测试接口测试,就能在企业中拿到一份非常不错的薪资。 这么重要的接口测试,一般也是面试笔试必问。为方便大家更…

鸢尾花数据集

鸢尾花数据集 from sklearn.datasets import load_iris from sklearn.datasets import load_iris from sklearn.datasets import fetch_20newsgroups #iris load_iris() #加载花的类别3(山鸢尾,虹膜鸢尾,变色鸢尾),特…

机器学习——CBOW基于矩阵(手动实操)

基于矩阵的CBOW基础算法,其实是负采样的前提算法。 主要是根据 预测准确率为22%左右 说实话。。。我已经很满意了,至少这个东西是可以去预测的,至于预测为什么不正确,我目前猜测主要还是跟词频有关。 在结果中,an…

onlyoffice api开发

编写代码 按照https://api.onlyoffice.com/editors/basic编写代码 <html> <head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, minimum-scal…

【数据结构初阶 7】二叉树:链式二叉树的基本操作实现

文章目录 &#x1f308; Ⅰ 定义二叉树结点&#x1f308; Ⅱ 创建二叉树结点&#x1f308; Ⅲ 遍历二叉树1. 先序遍历2. 中序遍历3. 后序遍历4. 层序遍历 &#x1f308; Ⅳ 销毁二叉树 &#x1f308; Ⅰ 定义二叉树结点 1. 每个结点都由三部分组成 数据域&#xff1a;存储本结…

matlab绘制雷达图和二维FFT变换图

1、内容简介 略 49-可以交流、咨询、答疑 matlab绘制雷达图和二维FFT变换图 NMO组及NORMAL组 RNFL层、GCL层、IPL层、GCC层、ORL层做雷达图&#xff08;共10张&#xff09; 2、内容说明 略 NMO组及NORMAL组 RNFL层、GCL层、IPL层、GCC层、ORL层请分别做雷达图&#xff08…

linux之前后端项目部署与发布

目录 前言 简介 一、安装Nginx 二、后端部署 2.1多个tomcat负载均衡 2.2 负载均衡 2.3 后端项目部署 三、前端部署 1.解压前端 2.Nginx配置文件修改 3.IP域名映射 4.重启Nginx服务 前言 上篇博主已经讲解过了单机项目的部署linux之JAVA环境配置JDK&Tomcat&a…