MySQL__锁

文章目录

😊 @ 作者:Lion J
💖 @ 主页: https://blog.csdn.net/weixin_69252724
🎉 @ 主题: MySQL__锁)
⏱️ @ 创作时间:2024年04月27日
————————————————

这里写目录标题

  • 文章目录
  • 什么是MySQL的锁?
    • 表锁与行锁有什么区别
    • 行级锁使用注意什么?
    • InnoDB 有哪几类行锁?
      • 间隙锁 和 临表锁的使用?
    • 共享锁与排他锁?
    • 什么是意向锁?
    • 当前读与快照读区别?
      • 快照读(一致性非锁定读)
      • 当前读 (一致性锁定读)

什么是MySQL的锁?

锁是一种常见的并发事务的控制方式。

表锁与行锁有什么区别

  • 表级锁: MySQL 中锁定粒度最大的一种锁,是针对非索引字段加的锁,对当前操作的整张表加锁,实现简单,资源消耗也比较少,加锁快,不会出现死锁。不过,触发锁冲突的概率最高,高并发下效率极低。表级锁和存储引擎无关,MyISAM 和 InnoDB 引擎都支持表级锁。
  • 行级锁: MySQL 中锁定粒度最小的一种锁,是 针对索引字段加的锁 ,只针对当前操作的行记录进行加锁。 行级锁能大大减少数据库操作的冲突。其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。行级锁和存储引擎有关,是在存储引擎层面实现的。
    1. 什么叫做针对索引字段加锁?
    针对索引字段加锁是指在执行 SQL 操作时,数据库会根据索引来对数据行进行加锁,而不是对整个表进行加锁。这样的锁定方式被称为行级锁,因为它仅锁定正在操作的行,而不是整个表。
    2. 如果查询不走索引字段, 那还怎么加锁, 直接加表锁吗?
    别说,还真是. 如果不走索引, 那他查询时候不知道给哪一行数据加锁, 就只能给表加锁了. 此时就根据操作语句来看是加什么锁, 看是共享锁还是独占锁. InnoDB存储引擎一般对于普通的查询语句来说都是加共享锁
  • 当查询字段是索引字段时,MySQL 可以直接利用索引进行定位,并且只需要锁定索引对应的行,而不需要锁定整个表或者额外的间隙。这样可以最大程度地减少锁定的范围,提高并发性能,同时确保了事务的隔离性和一致性。
  • 当查询字段不是索引字段时,MySQL 需要进行全表扫描或者范围扫描,无法直接利用索引定位到符合条件的行。在这种情况下,为了保证查询结果的一致性,MySQL 可能会使用表级锁定或者间隙锁,以确保事务之间不会出现干扰或者幻读现象。这会增加锁定的范围,降低并发性能,但能保证数据的完整性。

行级锁使用注意什么?

InnoDB 的行锁是针对索引字段加的锁,表级锁是针对非索引字段加的锁。当我们执行 UPDATE、DELETE 语句时,如果 WHERE条件中字段没有命中唯一索引或者索引失效的话,就会导致扫描全表对表中的所有行记录进行加锁。这个在我们日常工作开发中经常会遇到,一定要多多注意!!!

InnoDB 有哪几类行锁?

  • 记录锁:也被称为记录锁,属于单个行记录上的锁。

  • 间隙锁:锁定一个范围,不包括记录本身。

  • 临键锁:临键锁是查询时InnoDB根据查询的条件而锁定的一个范围,这个范围中包含有间隙锁和记录锁;临键锁=间隙锁+记录锁。
    其设计的目的是为了解决Phantom Problem(幻读);主要是阻塞insert,但由于临键锁中包含有记录锁,因此临键锁所锁定的范围内如果包含有记录,那么也会给这些记录添加记录锁,从而造成阻塞除insert之外的操作;

间隙锁 和 临表锁的使用?

在默认情况下, InnoDB在RR的事务级别下, 使用间隙锁和索引扫描来防止幻读的情况, 在默认的隔离级别 RR下,行锁默认使用的是 Next-Key Lock(临键锁)。

  • 如果操作的索引是唯一索引或主键, 数据存在情况

就会将临键锁降级为记录所只对操作的数据进行加锁, 仅仅是锁住索引本身,而不是范围。

  • 如果Sql语句的条件判断字段如果为唯一索引,且给不存在的记录加锁时,行锁会优化为间隙锁给前后间隙加锁。例如:

在这里插入图片描述

记录3-8, 已经被事务1锁住了导,导致事务2inset不了

  • 如果Sql语句的条件判断字段如果为非唯一索引, 那么就会给此数据, 以及此数据前后的数据加上间隙锁

在这里插入图片描述
比如查询:

SELECT * FROM cum WHERE age = 6 LOCK IN SHARE MODE,那么id为(1,6][6,10)的数据会加锁。  
  • 范围查询的Sql语句的条件判断字段如果为唯一索引,会将此行数据和后面的全部间隙加上锁。例如:

比如执行:

SELECT * FROM cum WHERE id >= 10 LOCK IN SHARE MODE,那么会将[10,无穷大)加锁。

注意:间隙锁唯一目的是防止其他事务将数据插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用间隙锁。

对于行锁(记录锁, 间隙锁, 临表锁)都是区分一个共享锁和排他锁的

共享锁与排他锁?

不论是表级锁还是行级锁,都存在共享锁(S 锁)和排他锁(X 锁)这两类:

  • 共享锁(S 锁):又称读锁,事务在读取记录的时候获取共享锁,允许多个事务同时获取。
  • 排他锁(X 锁):又称写锁/独占锁,事务在修改记录的时候获取排他锁,不允许多个事务同时获取。如果一个记录已经被加了排他锁,那其他事务不能再对这条事务加任何类型的锁。
    排他锁与任何的锁都不兼容,共享锁仅和共享锁兼容。

在这里插入图片描述
由于 MVCC 的存在,对于一般的 SELECT 语句,InnoDB 不会加任何锁, 都是使用 一致性非锁定读的方式来加共享锁方式
不过, 你可以通过以下语句显式加共享锁或排他锁。

 # 共享锁
SELECT ... FOR SHARE;
# 排他锁
SELECT ... FOR UPDATE;

什么是意向锁?

如果需要用到表锁的话,如何判断表中的记录没有行锁呢,一行一行遍历肯定是不行,性能太差。
我们需要用到一个叫做意向锁的东东来快速判断是否可以对某个表使用表锁。

意向锁是表级锁,共有两种:

  • 意向共享锁 :事务有意向对表中的某些记录加共享锁(S 锁),加共享锁前必须先取得该表的 意向共享锁。
  • 意向排他锁:事务有意向对表中的某些记录加排他锁(X 锁),加排他锁之前必须先取得该表的意向排他锁。

意向锁是由数据引擎自己维护的,用户无法手动操作意向锁,在为数据行加共享/排他锁之前,InooDB 会先获取该数据行所在在数据表的对应意向锁。

这种机制可以帮助快速判断表中的记录是否被锁定,从而优化锁定的策略,减少不必要的等待时间和资源浪费。

当前读与快照读区别?

快照读(一致性非锁定读)

就是单纯的 SELECT 语句,但不包括下面这两类 SELECT 语句:

# 排他
SELECT ... FOR UPDATE
# 共享锁  
SELECT ... LOCK IN SHARE MODE;
# 共享锁 
SELECT ... FOR SHARE;

快照即记录的历史版本,每行记录可能存在多个历史版本(这是数据库的多版本技术)。
快照读的情况下,如果读取的记录正在执行 UPDATE/DELETE 操作,读取操作不会因此去等待记录上 X 锁的释放,而是会去读取行的一个快照
只有在事务隔离级别 RC(读取已提交) 和 RR(可重读)下,InnoDB 才会使用一致性非锁定读:

  • 在 RC 级别下,对于快照数据,一致性非锁定读总是读取被锁定行的最新一份快照数据。这也就是为什么会导致不可重复读的原因
  • 在 RR 级别下,对于快照数据,一致性非锁定读总是读取本事务开始时的行数据版本。快照读比较适合对于数据一致性要求不是特别高且追求极致性能的业务场景。

当前读 (一致性锁定读)

就是给行记录加 X 锁或 S 锁。

当前读的常用语句如下

# 加一个X锁
SELECT...FOR UPDATE
# 加一个S锁
SELECT...LOCK IN SHARE MODE
# 加一个S锁
SELECT...FOR SHARE
# 加一个X锁
INSERT...
UPDATE...
DELETE...

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

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

相关文章

Java高阶私房菜-JVM垃圾回收机制及算法原理探究

目录 垃圾回收机制 什么是垃圾回收机制 JVM的自动垃圾回收机制 垃圾回收机制的关键知识点 初步了解判断方法-引用计数法 GCRoot和可达性分析算法 什么是可达性分析算法 什么是GC Root 对象回收的关键知识点 标记对象可回收就一定会被回收吗? 可达性分析算…

阳光电源社招前程无忧智鼎题库及远程包过助攻需要重点考察什么?

阳光电源社招前程无忧智鼎题库及远程包过助攻需要重点考察什么? 结合长期服务大型国有企业校招工作的经验,我们总结出阳光电源社招笔试的典型模式:行政职业能力测试企业应知应会测试心理测评,综合考察候选人的政治素养、文化素养…

VC2022 + protobuf

google这是有私心啊,protobuf从某个版本开始,依赖了一个google自己推出的大型组件集,Abseil,有点类似于Boost了,业内用的人,从个人狭窄的圈子来说,应该是不多的,据说google的众贤用的…

【UnityRPG游戏制作】RPG项目的背包系统商城系统和BOSS大界面

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

【C++】简易二叉搜索树

目录 一、概念: 二、代码实现: 大致结构: 1、遍历: 2、insert 3、find 4、erase 三、总结: 一、概念: 二叉搜索树又称为二叉排序树,是一种具有特殊性质的二叉树,对于每一个节…

springboot+springsecurity+vue前后端分离权限管理系统

有任何问题联系本人QQ: 1205326040 1.介绍 优秀的权限管理系统,核心功能已经实现,采用springbootvue前后端分离开发,springsecurity实现权限控制,实现按钮级的权限管理,非常适合作为基础框架进行项目开发。 2.效果图…

ICP点云配准初探

ICP点云配准初探 1 简介2 常用的点云配准算法3 ICP(Iterative Closest Point,最近点迭代法)3.1 ICP要解决的问题3.2 ICP的核心思想3.3 算法流程3.4 总结 4 ICP优缺点 1 简介 在逆向工程,计算机视觉,文物数字化等领域中…

香港BTC、ETH现货ETF同时通过,对行业意义几何?

香港比美国更快一步通过以太坊现货 ETF。 2024 年 4 月 15 日,香港嘉实国际资产管理有限公司(Harvest Global Investments)今天宣布,得到香港证监会的原则上批准,将推出两大数字资产(比特币及以太坊&#…

​可视化大屏C位图:园区鸟瞰

将园区鸟瞰图作为可视化大屏设计的焦点图有以下几个好处: 提供全局视图:园区鸟瞰图可以展示整个园区的布局和结构,提供全局视图。这对于大型园区或复杂的场所来说尤为重要,用户可以一目了然地了解整个园区的规模、分布和关联关系…

go设计模式之工厂方法模式

工厂方法模式 什么是工厂方法模式 工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化推迟到其子类。 这个接口就是工厂接口,子类就是具体工厂类,而需要创…

频率分析和离散傅里叶变换——DSP学习笔记四

背景知识 四种基本的傅里叶变换 基本思想:将信号表示为不同频率 正弦分量的线性组合 正弦信号和复指数时间信号的有用特性 相同频率但不同相位的正弦信号的任何线性组合,都是有着相同频率但不同相位,且幅度可能受改变的正弦信号。 复指数时…

EXCEL表格中的数字,为什么每次打开会自动变成日期?

一、典型现象 在工作中,有时会发现公司里的报表,经过多人多次的重复的使用和修改后,会出现这种情况: 1.在表格里按照需要输入数字,保存工作簿。 2.然而,再次打开工作簿,里面的数字变成日期&a…

Linux多线程(二) 线程同步 信号量互斥锁读写锁条件变量

多个进程同时访问某些资源时,必须考虑同步问题,以确保任一时刻只有一个进程可以拥有对资源的独占式访问。通常,程序对关键资源的访问代码只是很短的一段,我们称这段代码为关键代码段或者临界区,对进程同步,…

火绒安全概述

页面简介: 火绒安全是一款集多种安全功能于一体的国产软件,旨在为用户提供全面的计算机保护。本页面将详细介绍火绒安全的核心功能和使用方式。 页面内容概览: 杀毒防护 实时监控:详细介绍火绒安全如何实时检测系统中的文件和程序…

【强训笔记】day5

NO.1 思路&#xff1a;找到数量最小的字符&#xff0c;就可以知道you的数量&#xff0c;用o的数量减去you的数量再减去1就是oo的数量。 代码实现&#xff1a; #include<iostream>using namespace std;int main() {int q;cin >> q;int a, b, c;while (q--){cin &g…

Java web应用性能分析之【sysbench基准测试】

Java web应用性能分析之【CPU飙高分析之MySQL】-CSDN博客 Java web应用性能分析之【Linux服务器性能监控分析概叙】-CSDN博客 Java web应用性能分析概叙-CSDN博客 Java web应用性能分析之【基准测试】-CSDN博客 上面基本科普了一下基准测试&#xff0c;这里我们将从sysbench…

雷电模拟器,安卓手机模拟器电脑端去广告精简优化版 v9.0.70 (240427)

软件介绍 在众多安卓模拟器中&#xff0c;雷电模拟器作为电脑端手游的首选平台&#xff0c;由上海畅指网络科技有限公司研发并免费提供给用户。此模拟器搭载了先进的内核技术&#xff08;基于版本&#xff09;&#xff0c;确保了软件运行的高速性和稳定性。雷电模拟器还引入了…

【yolov8yolov5驾驶员抽烟-打电话-喝水-吃东西检测】

YOLO算法DMS驾驶员抽烟-打电话-喝水-吃东西检测数据集 YOLOv8和YOLOv5是深度学习中用于目标检测的先进算法&#xff0c;它们在实时性和准确性方面表现出色&#xff0c;适用于各种视频监控和图像处理应用&#xff0c;包括驾驶员行为监测。这些算法通过单次前向传播即可预测图像…

javaScript基础2

javaScript 一.运算符二.流程控制1.顺序流程控制2.分支流程控制&#xff08;1&#xff09;if/if..else/if多分支&#xff08;2&#xff09;.三元表达式&#xff08;4&#xff09;.switch和if else区别 3.循环流程控制(1).for循环/双重for循环(2).一些例子(3).while循环/do..whi…

SpringBoot 接口防抖(防重复提交)的一些实现方案

啥是防抖 所谓防抖&#xff0c;一是防用户手抖&#xff0c;二是防网络抖动。 在Web系统中&#xff0c;表单提交是一个非常常见的功能&#xff0c;如果不加控制&#xff0c;容易因为用户的误操作或网络延迟导致同一请求被发送多次&#xff0c;进而生成重复的数据记录。 要针对…