当前位置: 首页 > news >正文

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;

相关文章:

MySQL-锁

MySQL的锁机制 1.共享锁(Shared Lock)和排他锁(Exclusive Lock) 事务不能同时具有行共享锁和排他锁&#xff0c;如果事务想要获取排他锁&#xff0c;前提是行没有共享锁和排他锁。而共享锁&#xff0c;只要行没有排他锁都能获取到。 手动开启共享锁/排他锁&#xff1a; -- 对…...

ES6中变量解构赋值

数组的解构赋值 ES6规定以一定模式从数组、对象中提取值&#xff0c;然后给变量赋值叫做解构。 本质上就是一种匹配模式&#xff0c;等号两边模式相同&#xff0c;左边的变量就能对应的值。 假如解构不成功会赋值为undefined。 不需要匹配的位置可以置空 let [ a, b, c] …...

Dijkstra 邻接表表示算法 | 贪心算法实现--附C++/JAVA实现源码

以下是详细步骤。 创建大小为 V 的最小堆,其中 V 是给定图中的顶点数。最小堆的每个节点包含顶点编号和顶点的距离值。 以源顶点为根初始化最小堆(分配给源顶点的距离值为0)。分配给所有其他顶点的距离值为 INF(无限)。 当最小堆不为空时,执行以下操作: 从最小堆中提取…...

从城市吉祥物进化到虚拟人IP需要哪些步骤?

在2023年成都全国科普日主场活动中&#xff0c;推出了全国首个科普数字形象大使“科普熊猫”&#xff0c;科普熊猫作为成都科普吉祥物&#xff0c;是如何进化为虚拟人IP&#xff0c;通过动作捕捉、AR等技术&#xff0c;活灵活现地出现在大众眼前的&#xff1f; 以广州虚拟动力虚…...

认识SQLServer

深入认识SQL Server&#xff1a;从基础到高级的数据库管理 在当今数字时代&#xff0c;数据是企业成功的关键。为了存储、管理和分析数据&#xff0c;数据库管理系统&#xff08;DBMS&#xff09;变得至关重要。其中&#xff0c;Microsoft SQL Server是一款备受欢迎的关系型数据…...

Python开发IDE的比较:PyCharm vs. VS Code vs. Jupyter

Python开发IDE的比较&#xff1a;PyCharm vs. VS Code vs. Jupyter Python开发社区中已经存在了相当长时间的持续争论&#xff1a;PyCharm vs. VS Code vs. Jupyter。 PyCharm&#xff1a;专业人士的选择 让我们从PyCharm开始。它是一个功能强大的集成开发环境&#xff08;I…...

1206. 设计跳表

不使用任何库函数&#xff0c;设计一个 跳表 。 class Skiplist {int level0;Node headnull;public Skiplist() {}public boolean search(int target) {Node curhead;while(cur!null){while(cur.right!null&&cur.right.val<target){curcur.right;}if(cur.right!nul…...

【API要返回一棵树的结构】数据库表结构是平铺的数据,但是api要实现树状结构展示。api实现一棵树的结构,如何实现呢,递归?如何递归呢

数据库中的数据是平铺的&#xff0c;一行行的&#xff0c;但是api要查询出来的数据要求是一棵树的结构&#xff0c; 怎么把平铺的数据转换成树状结构呢&#xff1f; public List<CarbonRepo> findCarbonRepo(Integer type){// 1. 先查出所有数据。 baseFindList 方法就是…...

视频批量剪辑工具,自定义视频速率,批量剪辑工具助力创意无限”

在视频制作的世界里&#xff0c;每一个细节都至关重要。今天&#xff0c;让我们来探索一项强大且创新的功能——自定义视频速率。利用它&#xff0c;你可以轻松地调整视频播放速度&#xff0c;赋予你的作品独特的个性和风格。 首先第一步&#xff0c;我们要打开好简单批量智剪…...

starrocks启动和停止和重启脚本

StarRocks启动和停止和重启脚本 编辑脚本&#xff1a;vim start_stop_starrocks.sh 备注:IP修改为自己的IP即可 #!/bin/bashcase $1 in "start"){for i in 12.3.7.147 12.3.7.148 12.3.7.149 12.3.7.150doecho " --------启动 $i be -------"ssh $i &qu…...

升级Xcode 15后,出现大量Duplicate symbols问题

https://developer.apple.com/forums/thread/731090 升级到Xcode 15后&#xff0c;原先Xcode14可以编译的项目出现大量Duplicate symbols&#xff0c;且引用报错指向同一个路径&#xff08;一般为Framework&#xff09;下的同一个文件。经过查找相关解决&#xff0c;可通过添加…...

Godot2D角色导航教程(角色随鼠标移动)

文章目录 运行结果2D导航概述开始前的准备2D导航创建导航网格创建角色 其他文章 运行结果 2D导航概述 Godot为2D和3D游戏提供了多个对象、类和服务器&#xff0c;以便于基于网格或基于网格的导航和路径查找。 说到导航&#xff0c;就得说一下导航网格&#xff0c;导航网格定义…...

论文阅读--Cell-free massive MIMO versus small cells

无蜂窝大规模MIMO与小蜂窝网络 论文信息 Ngo H Q, Ashikhmin A, Yang H, et al. Cell-free massive MIMO versus small cells[J]. IEEE Transactions on Wireless Communications, 2017, 16(3): 1834-1850. 无蜂窝大规模MIMO中没有小区或者小区边界的界定&#xff0c;所有接入…...

【深度学习】UniControl 一个统一的扩散模型用于可控的野外视觉生成

论文&#xff1a;https://arxiv.org/abs/2305.11147 代码&#xff1a;https://github.com/salesforce/UniControl#data-preparation docker快速部署&#xff1a;https://qq742971636.blog.csdn.net/article/details/133129146 文章目录 AbstractIntroductionRelated WorksUniCo…...

使用ChatGPT和MindShow一分钟生成PPT模板

对于最近学校组织的实习答辩&#xff0c;由于时间太短了&#xff0c;而且小编也特别的忙&#xff0c;于是就用ChatGPT结合MindShow一分钟快速生成PPT&#xff0c;确实很实用。只要你跟着小编后面&#xff0c;你也可以快速制作出这个PPT&#xff0c;下面小编就来详细介绍一下&am…...

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…...

【Linux】Linux 之用户管理

Linux 之用户管理 1.Linux 下的用户2.配置文件3.用户管理3.1 useradd3.1.1 创建用户并指定用户 ID3.1.2 指定用户的主目录3.1.3 指定用户的主组 3.2 adduser3.3 userdel3.4 密码文件3.4.1 字段含义解释3.4.2 给用户添加密码 3.5 其他与用户相关的命令 4.修改用户的信息4.1 user…...

NLP:Attention和self-attention的区别

核心思想是根据不同的上下文为不同的信息分配不同的注意力权重 效果&#xff1a; Attention&#xff1a;它允许模型在解码时聚焦于输入的特定部分&#xff0c;从而更好地捕获上下文信息。Self-attention&#xff1a;它帮助模型捕获输入序列内部的关系&#xff0c;无论这些关系…...

Gap Year Plan

Gap Year Plan gap year 几个大方向 健康 60 KG10 新朋友 钱 5W RMB基本常识、社会机制补齐开网店 英语 TOELF日常交流 & 面试 口语Science Research Writing 2nd 课程 科研常识CMU 15-445MIT 6.824CMU 15-721Full Stack OpenDDIA 实习 GSOC 2024 PostgreSQL / …...

厌烦了iPhone默认的热点名称?如何更改iPhone上的热点名称

你对你默认的热点名称感到厌倦了吗&#xff1f;这篇文章是为你准备的。在这里&#xff0c;你可以了解如何轻松更改iPhone上的热点名称。 个人热点会将你的手机数据转换为Wi-Fi信号。手机上的个人热点使用户能够与其他用户共享其蜂窝数据连接。当你在WIFI网络之外时&#xff0c…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...

云原生安全实战:API网关Envoy的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口&#xff0c;负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...

LangChain【6】之输出解析器:结构化LLM响应的关键工具

文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器&#xff1f;1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...