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. 记录锁的释放通常发生在事务提交时,因此事务的持有时间应该尽量短,以减小锁的粒度和持有时间。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git笔记——4

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、操作标签 二、推送标签 三、多人协作一 完成准备工作 协作开发 将内容合并进master 四、多人协作二 协作开发 将内容合并进master 五、解决 git branch -a…

37、IO进程线程/使用消息队列完成进程间通信20240225

一、使用消息队列完成两个进程间相互通信。 代码&#xff1a; 进程1代码&#xff1a; #include<myhead.h> struct msgbuf {long mtype;//消息类型char mtext[1024];//消息正文 }; //宏定义结构体消息正文大小 #define MSGSIZE (sizeof(struct msgbuf)-sizeof(long)) i…

大学生多媒体课程学习网站thinkphp+vue

开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 运行环境:phpstudy/wamp/xammp等开发背景 &#xff08;一&#xff09; 研究课程的提出 &#xff08;二&#xff09;学习网站的分类与界定…

Three.js 基础属性

三维坐标系 辅助观察坐标系 THREE.AxesHelper()的参数表示坐标系坐标轴线段尺寸大小&#xff0c;你可以根据需要改变尺寸。 // AxesHelper&#xff1a;辅助观察的坐标系 const axesHelper new THREE.AxesHelper(150); scene.add(axesHelper);材质半透明设置 设置材质半透明…

Vulnhub靶机:Hacker_Kid

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;Hacker_Kid&#xff08;10.0.2.42&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhub.com/hac…

Python和Jupyter简介

在本notebook中&#xff0c;你将&#xff1a; 1、学习如何使用一个Jupyter notebook 2、快速学习Python语法和科学库 3、学习一些IPython特性&#xff0c;我们将在之后教程中使用。 这是什么&#xff1f; 这是只为你运行在一个个人"容器"中的一个Jupyter noteboo…

蓝桥杯备战刷题(自用)

1.被污染的支票 #include <iostream> #include <vector> #include <map> #include <algorithm> using namespace std; int main() {int n;cin>>n;vector<int>L;map<int,int>mp;bool ok0;int num;for(int i1;i<n;i){cin>>nu…

【前端素材】推荐优质后台管理系统Start Admin平台模板(附源码)

一、需求分析 后台管理系统是一种用于管理网站、应用程序或系统的工具&#xff0c;它通常作为一个独立的后台界面存在&#xff0c;供管理员或特定用户使用。下面详细分析后台管理系统的定义和功能&#xff1a; 1. 定义 后台管理系统是一个用于管理和控制网站、应用程序或系统…

Github开源贡献者的狂欢——教你如何免费领取价值$200的Starknet空投

前言&#xff1a; 2024 又迎来了四年一度的 BTC 减半时刻&#xff0c;币圈仿佛一下又热闹了起来&#xff0c;这几天有一个新的基于 ETH 的项目诞生了&#xff1a;StarkNet&#xff0c;代号 STRK&#xff0c;凡是在前 5000 个开源项目贡献过至少 3 个 commit 的程序猿都会被空投…

C#,数组数据波形排序(Sort in Wave Form)的朴素算法与源代码

1 波形排序 所谓“波形排序”就是一大一小。 将n个身高互不相同的人排成一行 ,对于每个人 ,要求他要么比相邻的人均高 ,要么比相邻的人均矮 ,问共有多少种排法 ,这一问题称为波形排列问题。 2 源程序 using System; using System.Collections; using System.Collections.Gen…

Makefile静态库动态库的构建和链接之工程实用篇

静态库和动态库的构建和链接 现有C工程目录结构如下&#xff1a; add.h int add(int a, int b);add.cpp #include "add.h"int add(int a, int b) {return ab; }main.cpp #include <iostream> #include "add.h"int main() {std::cout << a…

Spring Boot 项目集成camunda流程引擎

使用camunda开源工作流引擎有&#xff1a;通过docker运行、使用springboot集成、部署camunda发行包、基于源代码编译运行等多种方式。 其中&#xff0c;通过源代码编译运行的方式最为复杂&#xff0c;具体参考&#xff1a;https://lowcode.blog.csdn.net/article/details/1362…

个人博客系列-前端部署-创建框架(4)

项目环境介绍 Vue3 Vite TypeScript 服务器&#xff1a;阿里云contos node版本&#xff1a;v18.18.2 npm版本&#xff1a;v10.2.4 执行下面一行命令&#xff0c;创建vue3框架 npm create vuelatest修改端口&#xff1a;9528&#xff0c; 此步骤可以忽略&#xff08;使用默…

云呐矿井智能化运维工是什么?智能机器人运维岗位

煤矿智能运维是指利用先进的信息技术和自动控制&#xff0c;在煤矿生产过程中对煤矿设备进行监测、维护和管理。其职责和工作任务主要包括: 工作环境:  面对复杂的地质条件和极端的气候环境&#xff0c;煤矿智能运维工程师往往需要在地下煤矿、监测中心等环境中工作。因此&a…

MCU多核异构通信原理

摘要&#xff1a; 本文结合瑞萨RZ/G2L 多核处理器&#xff0c;给大家讲述一下多核异构设计及通信的原理。 随着电子技术的不断发展&#xff0c;以及市场需求的日益增长&#xff0c;嵌入式系统不仅要求执行复杂的控制任务&#xff0c;还需要实时地采集和处理数据。 为了满足这…

游戏配置内存“瘦身”策略

背景 游戏配置数据绝对是游戏服务器进程的内存大头,有些游戏服务器单纯数据配置的容量就超过一个G。因此,这部分内存优化也就放在首要位置了。 优化策略 在《服务器进程如何降低内存》一文中,我们讲述了可以通过“优化游戏配置缓存”来降低游戏服务器进程的内存使用量。本…

基于协同过滤算法的体育商品推荐系统

摘要 本文深入探讨了基于协同过滤算法的体育商品推荐系统的构建方法及其在电子商务中的重要性。首先&#xff0c;介绍了协同过滤算法的基本原理&#xff0c;包括用户-商品矩阵、相似度度量和推荐生成。其次&#xff0c;探讨了协同过滤算法在体育商品推荐中的两种主要应用方式&a…

sql-labs第46关(order by盲注脚本)

一、环境 网上有自己找 二、解释 order by 注入我们看他的true和false来进行注入出来 二、实操 让我们用sort 看看源码 最终我们的id是放到order by后面了 如果我们直接用列去排序 ?sortusername/password username&#xff1a; password&#xff1a; 可以看到顺序是不…

IO进程线程:通信

1.定义互斥锁 #include<myhead.h>int num520;//临界资源//1.创建一个互斥锁变量 pthread_mutex_t mutex;//定义任务&#xff11;函数 void *task1(void *arg) {printf("11111111111111\n");//3.获取锁资源pthread_mutex_lock(&mutex);num1314;sleep(3);pr…

数据结构与算法:红黑树讲解

关于红黑树&#xff0c; 这篇讲的更详细易懂。 https://www.cnblogs.com/jakelin/p/14324966.html 一颗平衡的二叉搜索树的任意节点平均查找效率为树的高度h&#xff0c;即O(lgn)。 但是如果二叉搜索树的失去平衡&#xff08;元素全在一侧&#xff09;&#xff0c;搜索效率就…