MySQL中的锁(二) - 行锁

一、行锁简介

MySQL中行锁是一种用于控制并发访问的锁机制,它可以在事务中对数据库表的行进行加锁,以保证数据的一致性和完整性。行锁是MySQL中最细粒度的锁,只锁定事务需要修改的数据行,而不是锁定整个表或者数据库。

MySQL行锁是由存储引擎实现的,但并不是所有存储引擎都支持,比如MyISAM引擎不支持行锁,只支持表锁。InnoDB引擎支持行锁,并且是默认的存储引擎,它支持事务和行级锁定。

二、行锁类型

  • 记录锁(Record Lock):直接锁定被操作的数据行。用于保护单个记录,可以是共享锁或排他锁。

# 给数据行加排他锁(X锁),其他事务不能读写这一行数据
START TRANSACTION;
#锁定数据行,其他事务不能读取和修改
SELECT * FROM user WHERE id =1 FOR UPDATE;
# 使用完提交事务,释放锁
COMMIT;# 给数据行加共享锁(S锁),其他事务读取这一行数据单不能修改
START TRANSACTION;
#锁定数据行,其他事务可以读取,不能修改
SELECT * FROM user WHERE id =1  LOCK IN SHARE MODE;
# 使用完提交事务,释放锁
COMMIT;# MySQL中UPDATE 或 DELETE 语句会自动加上排他锁
START TRANSACTION;
#更新数据行,同时锁定
UPDATE user SET NAME='小云' WHERE id=1;
# 使用完提交事务,释放锁
COMMIT;
  • 间隙锁(Gap Lock):锁定一个范围但不包括该范围内的任何实际数据记录,主要用于阻止其他事务在锁定数据范围内插入新数据,用于防止幻读(Phantom Read)的发生

# 表数据
mysql> select * from user;
+----+-----------+------+------+---------------------+
| id | name      | age  | sex  | create_time         |
+----+-----------+------+------+---------------------+
|  1 | 张三      |   25 | 男   | 2024-03-19 18:18:59 |
|  3 | 王五      |   28 | 男   | 2024-03-19 18:18:59 |
|  4 | 赵六      |   22 | 女   | 2024-03-19 18:18:59 |
|  5 | 孙七      |   35 | 男   | 2024-03-19 18:18:59 |
|  6 | 周八      |   29 | 女   | 2024-03-19 18:18:59 |
|  7 | 吴九      |   31 | 男   | 2024-03-19 18:18:59 |
|  8 | 郑十      |   27 | 女   | 2024-03-19 18:18:59 |
|  9 | 陈十一    |   33 | 男   | 2024-03-19 18:18:59 |
| 10 | 林十二    |   26 | 女   | 2024-03-19 18:18:59 |
+----+-----------+------+------+---------------------+
10 rows in set (0.00 sec) START TRANSACTION;
#
INSERT INTO user (id, name, age,sex,create_time) VALUES (2, 'David2', 21,'男',now());
# 使用完提交事务,释放锁
COMMIT;  # 在没有执行commit时,其他事务执行以下插入将被阻塞,直到上面事务提交后,下面语句将提示主键冲突
mysql> INSERT INTO user (id, name, age,sex,create_time) VALUES (2, 'David2', 21,'男',now());
  • 临键锁锁(Next-Key):结合了记录锁和间隙锁,锁定一个范围包括其边界上的记录,防止其他事务在范围内插入新记录。临键锁只在可重复读(Repeatable Read)或更高隔离级别下生效。如果将隔离级别设置为读已提交(Read Committed),则不会使用临键锁。

间隙锁和临键锁的区别

  • 间隙锁:间隙锁的目的是防止在RR隔离级别下的幻读现象,即保证当前范围内的数据量在事务执行期间保持一致。

  • 临键锁:临键锁则是为了确保对特定记录的独占访问,防止其他事务对这些记录以及它们之间的间隙进行插入或修改操作。

三、MySQL行锁的特点

  1. 行锁的锁定粒度较小,只锁定事务需要修改的行数据。允许其他事务同时对不同的行进行操作,进而提高了并发性能。

  2. 行锁有不同的模式,如共享锁(S锁)和排他锁(X锁)。共享锁允许其他事务读取被锁定的数据行,而排他锁则不允许其他事务读写被锁定的数据行。

  3. 行锁锁定粒度小,能够有效提高数据库的并发性能。在高并发场景下,数据库能够处理更多的并发请求

  4. 行锁属于悲观锁的一种实现方式,它在数据被访问之前就加锁,以防止其他事务的干扰。与之相对的是乐观锁,乐观锁通常在数据更新时才进行检查和锁定。

  5. MySQL会自动根据事务的隔离级别和操作类型(读或写)来决定是否加锁。

  6. 开发者无需手动添加行锁,MySQL会根据需要自动加锁。

  7. MySQL会检测并处理不同事务之间的锁冲突,避免死锁的发生。

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

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

相关文章

Java项目:基于Springboot+vue社区医院管理系统设计与实现(源码+数据库+毕业论文)

一、项目简介 本项目是一套基于Springbootvue社区医院管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、功能…

百元不入耳蓝牙耳机哪个好?必入五款高性价比产品

喜欢听歌的朋友都会遇到一个常见问题,长时间戴耳机容易导致耳朵不适,甚至疼痛难忍。这种情况下,要是不听音乐反而感到不舒服,真是让人苦恼,仿佛音乐与耳机无法和谐共存。但是,难道就没有一款既舒适又让人心…

【STL】list的底层原理及其实现

文章目录 list的介绍list的整体结构设计list的构造代码模拟实现: list节点类的实现list 迭代器Iterator的使用以及实现Iterator的使用Iterator的底层实现反向迭代器 list与vector的比较实现list类 list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列…

4.7学习总结

java学习 一.Stream流 (一.)概念: Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等。Stream流是对集合(Collection)对象功能的增强&…

使用ShardingSphere报错

使用ShardingSphere报错 1604 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near SHOW VARIABLES LIKE sql_mode; SELECT COUNT(*) AS support_ndb FROM information_ at line 1报错…

【STL学习】(4)vector的模拟

前言 本文将模拟实现vector的常用功能,目的在于更深入理解vector。 一、前置知识 在模拟之前先对vector的结构和常用接口学习,有一个大致了解。看源码,本文参考的源码是SGI版本的stl3.0。 技巧: 看源码不要一行一行的看&#xff…

全局监听钩子实现 笔记本x键坏了用其他键代替,或者类似游戏一键连招功能实现 (附带脚本开机一键运行)

前言 问题:博主使用笔记本时擦键盘不小心 进水了导致 坏了2个键盘 更换太麻烦所以想出了几个方法 1 系统自带的模拟键盘 可是每次都要点出来太麻烦 2 使用第三方工具 结果只找到github源码 下载地址找不到 /(ㄒoㄒ)/~~ 3 使用java方法 KeyListener 使用KeyListener监听键盘事件…

【全套源码教程】基于SpringBoot+MyBatis+Vue的流浪动物救助网站的设计与实现

目录 前言 需求分析 可行性分析 技术实现 后端框架:Spring Boot 持久层框架:MyBatis 前端框架:Vue.js 数据库:MySQL 功能介绍 前台界面功能介绍 动物领养及捐赠 宠物论坛 公告信息 商品页面 寻宠服务 个人中心 购…

Qt+OpenGL入门教程(四)——VBO、VAO和EBO

前面我们已经简单绘制了一个三角形,但这只是个小demo是远远不够的,当顶点数据很多时,解析很麻烦时我们应该如何处理呢?接下来我们来介绍一下在OpenGL开发中帮助我们提升渲染性能的几种数据对象。 注意:所有代码都是基…

全面探究 LangChain Text Splitters

全面探究 LangChain Text Splitters 0. 引言1. 文本拆分器的类型2. 探究各个文本拆分器2-1. Split by HTML header2-2. Split by HTML section2-3. Split by character2-4. Split code2-5. MarkdownHeaderTextSplitter2-6. Recursively split JSON2-7. Recursively split by ch…

力扣---分隔链表

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1: 输入:head [1,4,3,2,5,2], x 3 输出&a…

【Nginx】配置Nginx实现跨域策略

弹琵琶又见当年镜前你梳头 拨一首满花春秀 今日月下再醉孤酒 雨落枝头年复一年谁白发留 让爱随相思入梦左右 梦见我们还挽着手 🎵 马天宇《青衣》 在现代web开发中,跨源资源共享(CORS,Cross-Origin Resource…

C语言调用Python

目录 1.直接调用python语句 头文件引用 2.调用无参有参函数 1、调用无参函数 1.建立nopara.py文件 2.使用c语言根据上面流程进行调用 2、调用有参函数 1.建立nopara.py文件 2.使用c语言根据上面流程进行调用 C语言调用python需要我们已经安装好了libpython3的 dev依赖…

DFS序列

什么是DFS序 DFS序是指对一棵树进行DFS时,每个节点被访问到的顺序。DFS序分成两个部分:进入该节点的顺序和退出该节点的顺序。 如何求DFS序 对于DFS中当前节点 1:计数 2:进入当前节点的顺序等于当前计数 3:想所有…

Shell脚本从0到会基础学习(个人学习)

一、前言 本人在找工作的时候,发现有的职位要会shell或者是python其中一种脚本语言。由于博主学过python。所以专门开栏学习,只做个人学习。一天学会那种~ 二、练习 2.1 我的第一个脚本--HelloWorld 代码 运行结果 2.2 输出系统常量和 自定义变量 #!…

5. 4 二重循环将二维数组的某列、某矩形转大写

5. 4 二重循环将二维数组的某列、某矩形转大写 1. 把每一行的b都变成大写 assume cs:codesg,ds:data,ss:stack data segmeNTstr db aaaaabbbbbcccccdb aaaaabbbbbcccccdb aaaaabbbbbcccccdb aaaaabbbbbccccc,$ data endsstack segmentdb 10 dup(0) stack endscodesg SEgments…

一种遥感影像多类变化检测方法

多任务学习孪生网络的遥感影像多类变化检测 马惠1, 刘波2, 杜世宏2 1.河南省国土空间调查规划院,郑州 450016 2.北京大学遥感与地理信息系统研究所,北京 100871 摘要: 精确掌握土地覆盖/利用的变化及变化类型对国土空间规划、生态环境监测、灾害评估等有着重要意义,然而现有…

渲染一帧特效需要多少钱?云渲染特效每帧成本

特效渲染的成本受到诸多因素的影响,每帧的渲染费用是评估整个项目预算的重要依据。随着云渲染技术的发展,其高效率和可伸缩性赢得了业界的广泛关注。对于影视制作公司和独立创作者而言,掌握云渲染特效的单帧成本是管理和优化预算分配的关键。…

PCL 点到三角形的距离(3D)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 给定三角形ABC和点P,设Q为描述ABC上离P最近的点。求Q的一个方法:如果P在ABC内,那么P的正交投影点就是离P最近的点Q。如果P投影在ABC之外,最近的点则必须位于它的一条边上。在这种情况下,Q可以通过计算线段AB、…

设计模式学习笔记 - 设计模式与范式 -行为型:5.策略模式(下):策略模式的应用,如何实现支持给不同大小文件排序的小程序

概述 上篇文章,主要介绍了策略模式的原理和实现,以及如何利用策略模式来移除 if-esle 或者 switch 分支判断逻辑。本章结合 “给文件排序” 的例子,来详细讲下策略模式的设计意图和应用场景。 此外,我还会通过进一步分析、重构&…