MySQL-锁

MySQL的锁机制

在这里插入图片描述

1.共享锁(Shared Lock)和排他锁(Exclusive Lock)

事务不能同时具有行共享锁和排他锁,如果事务想要获取排他锁,前提是行没有共享锁和排他锁。而共享锁,只要行没有排他锁都能获取到。

手动开启共享锁/排他锁:

-- 对需要查询的行添加共享锁
select .... from .... lock in share mode;
-- 对读取记录加排他锁
select .... from .... for update;

注意:当一个事务尝试获取一个已经被其他事务持有的排他锁时,它会进入等待状态,直到该锁被释放为止。在MySQL 8.0版本中,新增了NOWAIT和SKIP LOCKED两种语法,可以用来控制事务在获取不到锁时的行为。

delete操作过程:

  1. 事务开始,获取待删除数据的排他锁。
  2. 获取成功,执行删除操作。
  3. 事务提交
  4. 释放锁。

update操作过程:分为两种情况,有更改主键值和未修改主键值。

未修改主键值:

  1. 更新前后存储空间未发生变化:获取排他锁,在原记录进行修改。
  2. 更新前后存储空间发生变化:获取排他锁,将该记录删除,最后在插入一条新的记录。

修改主键值:在原记录进行一次delete操作,再来一次insert操作。

insert操作过程:一般情况下,insert操作并不加锁,通过一种隐式锁保护新插入的记录不被未提交的事务所看到。

注意:共享锁->排他锁(阻塞)+共享锁(阻塞)

2.表锁

2.1X锁和S锁

表锁:锁定整张表,不依赖于存储引擎,表锁的开销较小,但是锁粒度大,并发执行效率低。

特殊场景:在修改表结构的过程中像alter table 、drop table这样的语句,就会有表锁的存在,同时也会阻塞其他对表的操作语句(update、select…)。

表级别的X锁和S锁:

-- 添加S锁(InnoDB引擎会对表table添加S锁)
LOCK TABLES table READ;
-- 添加X锁(InnoDB引擎会对表table添加X锁)
LOCK TABLES table WRITE;
-- 解锁
UNLOCK TABLES;

2.2意向锁(intention lock)

InnoDB支持多粒度锁,允许行级锁和表级锁共存。

  1. 为了协调行锁和表的关系,支持多粒度锁共存。

存在的问题:如果数据量非常大,表如果要知道哪一行存在锁,就非常的麻烦,因此就有了意向锁。

如果我们给某一行的数据添加了锁,数据库会自动给更大的一级空间,比如数据页或表添加上意向锁,表示该数据页或数据表已经存在锁了。

-- 事务要获取某个行的S锁,必须先获得IS锁。
SELECT ... FROM table ... LOCK IN SHARE MODE;
-- 添加排他锁,会自动获取IS锁。
SELECT... FROM table ... for UPDATE;

意向锁和意向锁的兼容性:

意向共享锁意向排他锁
意向共享锁兼容兼容
意向排他锁兼容兼容

意向锁和表锁的兼容性:

意向共享锁意向排他锁
共享锁兼容不兼容
排他锁不兼容不兼容

2.3自增锁

表中字段存在AUTO_INCREMENT属性。当新增数据自动生成主键时,就会使用该锁来生成,保证生成的主键是自增且唯一的。

AUTOINC 锁具有如下特点:

  1. AUTO_INC 锁互不兼容,也就是说同一张表同时只允许有一个自增锁;
  2. 自增值一旦分配了就会 +1,如果事务回滚,自增值也不会减回去,所以自增值可能会出现中断的情况。

2.4元数据锁

主要为了解决表结构的修改和表数据修改冲突问题。

当对一个表增删改查操作的时候,加MDL读锁;当要对表结构变更操作的时候,加MDL写锁。

3.乐观锁和悲观锁

3.1乐观锁

实现乐观锁可以采用CAS(Compare And Swap)的方式,乐观的认为产生锁冲突的概率较小。适用于锁冲突概率比较小的场景。

在这里插入图片描述

ABA问题:假设最开始的数据是A,在线程1执行的过程中,有其他线程将数据修改成了B,又再次被修改为A,就会导致线程1错误的认为该数据没有被修改过,因此可以通过对数据添加一个版本号,对于每次修改,都会产生一个新的修改数据版本,通过比较数据版本判断数据是否被更改。

时间戳机制:通过比较时间戳判断数据是否被修改。

3.2悲观锁

悲观锁:依靠数据库提供的锁机制来实现。

SELECT … FOR UPDATE是MySQL中的悲观锁,执行过程会将所有扫描的行都锁上,因此在MySQL中用悲观锁必须使用索引,而不是全表扫描,否则会将整张表锁住。

4.行锁

4.1记录锁

SELECT ... FROM ... WHERE id = 1 FOR UPDATE;

记录锁:记录锁(Record Lock)是一种锁定索引记录的锁定方式。当一个事务需要访问某个索引记录时,它可以在该记录上加一个记录锁,以防止其他事务修改或删除该记录。记录锁是针对单个记录的,它只锁定该记录本身,不会影响其他记录。

4.2间隙锁

间隙锁在REPEATABLE READ隔离级别下是可以解决幻读问题的。给不存在的索引添加锁,那么添加的就是间隙锁。

例如有id ={1,3,5,8,10,15},锁定13,那么在区间(10,15)之间都不能插入新的数据。

SELECT ... FROM ... WHERE id = 13 FOR UPDATE;

注意:间隙锁的唯一目的就是阻止其他事务在间隙上插入记录,一个事务在一个间隙上加锁并不会阻止其他事务在相同间隙上加锁,无论是共享锁还是排它锁,他们互不冲突,执行相同的功能。

4.3临键锁

临键锁:临键锁(Next-Key Lock)是结合记录锁和间隙锁的一种锁定方式。它不仅锁定索引上的记录,还锁定该记录前面的间隙。

例如有:id={1,3,5,8,10,15},记录15被锁定了,且(10,+∞)不能添加记录。

SELECT ... FROM ... WHERE id<=15 AND id>10 for update;

4.4插入意向锁

插入意向锁(Insert Intention Lock)是MySQL中的一种间隙锁形式的意向锁,用于在INSERT操作之前设置。

在真正执行INSERT操作之前,每个事务会在要插入的行的前一条记录上加一个插入意向锁。这样,其他事务在尝试插入相同间隙时,会检查该间隙上是否已经存在插入意向锁。如果存在插入意向锁,那么其他事务就可以知道已经有其他事务打算在这个间隙中插入数据,就会进行等待而不是冲突。

由于插入意向锁之间不会相互冲突,多个事务可以同时持有相同间隙上的插入意向锁。这就避免了事务之间的互相冲突,提高了并发插入的性能。

需要注意的是,插入意向锁之间并不会相互冲突,多个事务可以同时持有相同间隙上的插入意向锁。

5.全局锁

锁整个数据库实例。

全局锁命令:

FLUSH TABLES WITH READ LOCK;

有相同间隙上的插入意向锁。这就避免了事务之间的互相冲突,提高了并发插入的性能。

需要注意的是,插入意向锁之间并不会相互冲突,多个事务可以同时持有相同间隙上的插入意向锁。

5.全局锁

锁整个数据库实例。

全局锁命令:

FLUSH TABLES WITH READ LOCK;

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

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

相关文章

更新Xcode 版本后运行项目出现错误 Unable to boot the Simulator 解决方法

错误截图 出现 Unable to boot the Simulator 错误原因很多&#xff0c;以下方法不一定都适用&#xff0c;我是通过以下方法解决的 打开命令终端输入以下命令&#xff0c;可能需要你输入开机密码 sudo rm -rf ~/Library/Developer/CoreSimulator/Caches

Linux知识点 -- 网络基础 -- 数据链路层

Linux知识点 – 网络基础 – 数据链路层 文章目录 Linux知识点 -- 网络基础 -- 数据链路层一、数据链路层1.以太网2.以太网帧格式3.重谈局域网原理4.MAC地址5.MTU6.查看硬件地址和MTU的命令7.ARP协议 二、其他重要协议或技术1.DNS&#xff08;Domain Name System&#xff09;2.…

css记录写一个奇怪的按钮

完成作业的时候发现一个很有意思的按钮&#xff0c;记录一下记录一下 看看界面 可以看出是一个奇形怪状的按钮&#xff0c;而且在按下的时候&#xff0c;图片和文字的颜色会改变 尝试解决 <!DOCTYPE html> <html lang"zh"> <head><meta chars…

vue3+elementPlus:el-tree复制粘贴数据功能,并且有弹窗组件

在tree控件里添加contextmenu属性表示右键点击事件。 因右键自定义菜单事件需要获取当前点击的位置&#xff0c;所以此处绑定动态样式来控制菜单实时跟踪鼠标右键点击位置。 //html <div class"box-list"><el-tree ref"treeRef" node-key"id…

一篇短小精悍的文章让你彻底明白KMP算法中next数组的原理

以后保持每日一更&#xff0c;由于兴趣较多&#xff0c;更新内容不限于数据结构&#xff0c;计算机组成原理&#xff0c;数论&#xff0c;拓扑学......&#xff0c;所谓&#xff1a;深度围绕职业发展&#xff0c;广度围绕兴趣爱好。往下看今日内容 一.什么是KMP算法 KMP&#x…

【垃圾回收概述及算法】

文章目录 1. 垃圾回收概述及算法2. 垃圾回收相关算法2.1 标记阶段&#xff1a;引用计数算法2.2 标记阶段&#xff1a;可达性分析算法2.3 对象的 finalization 机制2.3.1 一个对象是否可回收的判断 2.4 清除阶段&#xff1a;标记-清除算法2.5 清除阶段&#xff1a;复制算法2.6 清…

【苍穹外卖 | 项目日记】第一天

前言&#xff1a; 我打算用16天的时间写完黑马程序员的苍穹外卖项目&#xff0c;为了督促自己每天坚持写以及记录项目知识点&#xff0c;所以用这种项目日记的方式鞭策自己 目录 前言&#xff1a; 今日完结任务&#xff1a; 今日收获&#xff1a; 1.阅读代码框架&#xf…

C#对字典容器Dictionary<TKey, TValue>内容进行XML序列化或反序列化报错解决方法

一、问题描述 在使用C#对字典容器Dictionary<TKey, TValue>内容进行XML序列化报错【System.Exception:“不支持类型 System.Collections.Generic.Dictionary2[[System.String, mscorlib, Version2.0.0.0, Cultureneutral, PublicKeyTokenb77a5c561934e089],[System.Strin…

QQ浏览器怎么才能设置默认搜索引擎为百度

问题&#xff1a; 打开QQ浏览器&#xff0c;搜索相关信息时发现总是默认为”搜狗搜索引擎“&#xff0c;想将其转为”百度搜索引擎“ 解决&#xff1a; 1、点击浏览器右侧”菜单“图标&#xff0c;选择”设置“&#xff0c;如下图所示&#xff1a; 2、在”常规设置“中的”搜…

MAC版Gradle构建Spring5.X源码阅读环境

前言&#xff1a; 三年前鄙人有幸在现已几乎报废的Window的DELL中搭建过Spring源码环境&#xff0c;今天&#xff0c;Mac版的搭建&#xff0c;来了。 本篇文章环境搭建&#xff1a;Spring5.2.1 Gradle5.6.3-all jdk8 IDEA2022.3版本 文章目录 1、Spring源码下载2、Gradle下载…

教资一年可以考几次 教资考试每年次数介绍

教师资格证一年可以考两次。根据教师资格证考试规定&#xff0c;为了满足报考人员的工作需求&#xff0c;达到市场供求均衡的状态&#xff0c;教师资格证区别于其他的技术资格类的考试&#xff0c;会每年举行两次考试&#xff0c;分别在上半年和下半年各举行一次考试。 上半年…

运行软件找不到mfc140u.dll怎么解决,mfc140u.dll是什么文件

"找不到 mfc140u.dll"是一条错误信息&#xff0c;表示您的计算机上缺少一个名为 mfc140u.dll 的动态链接库&#xff08;DLL&#xff09;文件。这个文件通常与 Microsoft Visual C Redistributable 相关。Mfc140u.dll 是 Microsoft 基础类库&#xff08;MFC&#xff0…

React组件

一、React组件 函数组件 // 函数组件 // 组件的名称必须首字母大写 // 函数组件必须有返回值 如果不需要渲染任何内容&#xff0c;则返回 null function HelloFn () {return <div>这是我的第一个函数组件!</div> }// 定义类组件 function App () {return (<di…

动态代理IP常见超时原因及解决方法

在使用动态代理IP时&#xff0c;常常会遇到代理超时的问题。网络环境的不稳定性以及代理IP的质量问题&#xff0c;都可能会引起代理超时。这种情况下&#xff0c;代理服务器无法在规定时间内响应我们的请求&#xff0c;导致请求失败。 使用动态代理IP时&#xff0c;哪些原因会引…

iPhone15系类LDR6020P 超简外围手机转接器/拓展坞方案

目前市面上的手机大部分已经取消3.5音频耳机接口&#xff0c;仅仅保留了Type-c口。但是追求音质和零延迟的用户仍然会选择3.5mm有线耳机&#xff0c;因为在玩手机游戏的时候&#xff0c;音画不同步真的很影响游戏体验&#xff0c;所以Type-C转3.5mm接口线应运而生。 #iPhone15…

Maven聚合项目配合Springcloud案例

创建maven项目 导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache…

LeetCode 1251. 平均售价

题目链接&#xff1a;1251. 平均售价 题目描述 表&#xff1a;Prices Column NameTypeproduct_idintstart_datedateend_datedatepriceint (product_id&#xff0c;start_date&#xff0c;end_date) 是 prices 表的主键&#xff08;具有唯一值的列的组合&#xff09;。 price…

大数据学习(1)-Hadoop

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博>主哦&#x…

RTC 时间、闹钟

实时时钟RTC是一个独立的定时器。RTC模块拥有一个连续计数的计数器&#xff0c;在软件配置下&#xff0c;可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤醒单元。 在掉电情况下 RTC仍可以独立运行 只要芯片的备用电源…

材质、纹理、贴图的区别和关联

1、材质、纹理、贴图的概念 材质&#xff08;Material&#xff09;、纹理&#xff08;Texture&#xff09;、贴图&#xff08;Texture Map&#xff09;是计算机图形学中的三个概念&#xff0c;它们之间存在关系但也有一些区别。 材质&#xff08;Material&#xff09;是描述物…