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

MySQL数据库(八)☞ 我是不是锁神

目录

1 全局锁的应用

2 索引对行锁的影响

3 表锁(显式)--表级锁

4 元数据锁 MDL(隐式)--表级锁

5 意向锁(Intention)--IS锁 IX锁--表级锁(隐式)

6 记录锁-(Record)-S锁 X锁 -- 行级锁

7 如何理解select ... lock in share mode

8 记录锁/元数据锁/意向锁

9 如果意向排他锁由于第一行排他锁的出现而出现,但是此时我对第二行的数据执行update语句而出现排他锁会不会阻塞

10 间隙锁(Gap)-行级锁

11邻键锁(Next-Key)-行级锁

12 行锁之间的区分

1 全局锁的应用

锁->备份->解锁

  • flush tables with read lock;
  • mysqldump (-h ip地址linux中的数据库) -u root -p 123456 数据库名>路径.sql文件名.sql
  • unlock tables;

特点:

2 索引对记录锁的影响

索引是行级锁的基础,直接影响锁的粒度和并发性能。

  • 有索引时:记录锁基于索引定位到具体行
  • 无索引时:记录锁退化为表锁。(锁住所有行)

3 表锁(显式)--表锁

语法

-- 加读锁(允许其他会话读,禁止写)
LOCK TABLES table_name READ;-- 加写锁(禁止其他会话读和写)
LOCK TABLES table_name WRITE;

示例

-- 会话1
LOCK TABLES users WRITE;
UPDATE users SET name = 'Alice' WHERE id = 1;  -- 独占操作
UNLOCK TABLES;

4 元数据锁 MDL(隐式)--表锁

 元数据加锁过程是系统自动控制,无需显示使用,在访问一张表的时候会自动加上。

MDL锁主要作用是维护表元素的数据一致性,在表上有活动事务的时候不可以对元数据进行写入操作。 

作用对象主要是DML/DQL与 DDL之间  -俗称表结构的门卫

  • DML DQL操作(如 SELECTINSERT):自动加 MDL 读锁(MDL_SHARED_READ
  • DDL 操作(如 ALTER TABLE):自动加 MDL 写锁(MDL_EXCLUSIVE)。

示例

-- 会话1(未提交事务)
BEGIN;
SELECT * FROM users;  -- 持有 MDL 读锁-- 会话2(被阻塞)
ALTER TABLE users ADD COLUMN age INT;  -- 需要 MDL 写锁

结果:会话2 的 DDL 操作会等待会话1事务提交或超时(默认50秒)。

(需要手动验证,引擎默认自动提交事务)有事务存在不能对表结构进行操作,出现alter table 对表结构进行更改就会触发MDL读锁与写锁的冲突,将整张表锁住。

5 意向锁(Intention)--IS锁 IX锁--(隐式)--表锁

意向锁(Intention Locks)是为了优化表锁与行锁之间的协调而引入的机制,它允许数据库管理系统更高效地处理并发事务中的加锁请求。

在对表中某一行数据进行更新等操作时,表会对数据的这一行加上行锁,但是在此时加上表锁,表锁将会一行一行的排查,为了改进这种情况,引入了意向锁,在加上行锁时也会加上对应的意向锁,此时再加表锁时,意向锁会与表锁进行匹配判断是否兼容

简单理解是表中有行锁了,现在我们又想向这个表中添加表锁,但是在添加表锁之前往往会进行排查,因此引入了一个意向锁,添加的这个表锁会对表中的意向锁进行匹配,

(当一个事务打算对某些行加共享/排他锁时,InnoDB会在该表上自动加上意向共享/排他锁(相互绑定)。这是为了通知其他试图对该表加锁的事务,已经有行级别的共享锁存在或者即将存在,从而避免不必要的冲突检查)

如果一个事务打算对某些行加共享锁(S锁),那么在此之前,该事务会先在表上加上意向共享锁(IS锁)。这样做的目的是为了通知其他试图对整个表加锁的事务,已经有事务计划对表中的某些行进行读操作了。

6 记录锁-(Record)-S锁 X锁 -- 行锁

(Shared/Exclusive)  -俗称数据行的保镖

1 共享锁(Shared Locks)-并发读取

共享锁又称为读锁(S锁)它允许事务读取一行数据,但不允许修改或删改改行数据。

当一个事务对某行数据加上共享锁后,其他事务也可以对该行数据加上共享锁进行读取,但是不能加排他锁进行修改删除操作。这就意味着多个事务可以同时拥有一个资源的共享锁,从而实现并发读取数据而不会出现干扰。

select ... lock in share mode ;->对查询结果的行加上共享锁。

select ... for share ; -> 在MySQL 8.0 之后。

2 排他锁(Exclusive Locks)- 防止并发修改删除查询等

排他锁又称为写锁(X锁)(独占锁)他允许事务读取一行数据,还允许对其修改或者删除。

一旦某个事务获得了排他锁,其他的事务都不能再对该行数据加任何类型的锁,包括共享锁和排他锁,这样就确保了再任意时刻只有一个事务可以执行修改删除等操作,防止数据不一致的问题。

select ... for update ; -> 可以认为手动加上排他锁

insert ,update,delete等DML操作 -> 默认加上排他锁

7 如何理解select ... lock in share mode

执行这个语句时会施加两种类型的锁,一种是共享锁,另一种是MDL元数据共享锁

eg insert 语句会被默认加上排他锁以及MDL元数据共享锁

8 记录锁/元数据锁/意向锁

1 意向锁:协调表级锁与行级锁的关系,避免表级锁与行级锁发生冲突-伴随行锁出现

2 行级锁:保证事务对某一行或几行的独占访问(如防止脏读,不可重复读的出现)

3 元数据锁:保护表结构的一致性(如防止修改表结构时其他事务读取旧结构)-伴随SQL语句

9 如果意向排他锁由于第一行排他锁的出现而出现,但是此时我对第二行的数据执行update语句而出现排他锁会不会阻塞

  1. InnoDB 的行级锁是精确到行的,事务 A 的锁仅作用于 id=1 的行。

  2. 事务 B 的 UPDATE 需要获取 id=2 的行级 X 锁和表级 IX 锁,而 IX 锁是兼容的(允许多个事务同时持有 IX 锁)。

  3. 两行数据互不冲突,因此并发操作正常。

  1. 事务 A 的 SELECT ... FOR UPDATE 使用了范围查询(id BETWEEN 1 AND 10),InnoDB 会为符合条件的行加 X 锁,并添加间隙锁(Gap Lock),锁住 id=1~10 之间的间隙。

  2. 事务 B 的 UPDATE 试图修改 id=2 的行,但该行已被事务 A 的间隙锁覆盖,因此被阻塞。

10 间隙锁(Gap)-行级锁

间隙锁锁的是记录之间的间隙,不包括记录本身,是为了那些不存在的索引记录加锁,

11邻键锁(Next-Key)-行级锁

间隙锁+行锁的组合,锁定对应区间的情况下,还会将当前记录也锁住

12 行锁之间的区分

对一个条件列进行等值匹配,如果该条件列存在,但是没有索引加的就是表锁,如果有索引加的就是记录锁。

如果对唯一列做等值查询该加锁的记录不存在的时候,那么此时使用的就是间隙锁。

如果对非唯一的普通索引做等值查询时,向右遍历的最后一个值,不满足查询条件时,则会退化为间隙锁。

相关文章:

MySQL数据库(八)☞ 我是不是锁神

目录 1 全局锁的应用 2 索引对行锁的影响 3 表锁(显式)--表级锁 4 元数据锁 MDL(隐式)--表级锁 5 意向锁(Intention)--IS锁 IX锁--表级锁(隐式) 6 记录锁-(Record)-S锁 X锁 -- 行级锁 7 如何理解select ... lock in share …...

AI法理学与责任归属:技术演进下的法律重构与伦理挑战

文章目录 引言:智能时代的新型法律困境一、AI技术特性对传统法理的冲击1.1 算法黑箱与可解释性悖论1.2 动态学习系统的责任漂移1.3 多智能体协作的责任稀释二、AI法理学的核心争议点2.1 法律主体资格认定2.2 因果关系的技术解构2.3 过错标准的重新定义三、责任归属的实践案例分…...

华象新闻 | 2月20日前谨慎升级 PostgreSQL 版本

各位 PostgreSQL 用户,建议近期进行升级 PostgreSQL 版本。 2月20日计划进行非周期性版本发布 PostgreSQL全球开发团队计划于2025年2月20日进行一次非周期性发布,以解决2025年2月13日更新版本中引入的一个回归问题。 2月13日的更新版本包括了17.3、16.7、…...

【NLP】循环神经网络RNN

目录 一、认识RNN 二、RNN模型分类 三、传统RNN模型 3.1 结构分析 3.2 Pytorch构建RNN模型 3.3 优缺点 一、认识RNN RNN(Recurrent Neural Network),中文称作循环神经网络,一般以序列数据为输入,通过网络内部的结构设计有效捕捉序列之…...

pnpm, eslint, vue-router4, element-plus, pinia

利用 pnpm 创建 vue3 项目 pnpm 包管理器 - 创建项目 Eslint 配置代码风格(Eslint用于规范纠错,prettier用于美观) 在 设置 中配置保存时自动修复 提交前做代码检查 husky是一个 git hooks工具(git的钩子工具,可以在特定实际执行特…...

Vue的简单入门 一

声明:本版块根据B站学习,创建的是vue3项目,用的是vue2语法风格,仅供初学者学习。 目录 一、Vue项目的创建 1.已安装15.0或更高版本的Node.js 2.创建项目 二、 简单认识目录结构 三、模块语法中的指令 1.v-html 1.文本插值…...

VMware Workstate 的 Ubuntu18 安装 vmware tools(不安装没法共享)

在共享主机路径后,可以在: /mnt/hgfs/下方找到共享的文件。但没有安装vmware tool时是没法共享的。 如何安装vmware tool,网上版本很多。这里记录一下: VMware Workstation 17 Pro,版本:17.6.0 虚拟机系统…...

深入Flask:如何优雅地处理HTTP请求与响应

哈喽,大家好,我是木头左! 本文将带你深入了解如何在Flask中优雅地处理HTTP请求和响应,让你的应用更加高效、安全和用户友好。 创建一个简单的Flask应用 让从创建一个最简单的Flask应用开始: from flask import Flaskapp = Flask(__name__)@app.route(/) def...

Typescript 【详解】配置文件 tsconfig.json

用于控制 TypeScript 编译器如何将 .ts 文件编译为 .js 文件 可以使用命令生成 npx tsc --init{"compilerOptions": {"target": "ES6","module": "commonjs","strict": true},"include": ["src/…...

GC 基础入门

什么是GC(Garbage Collection)? 内存管理方式通常分为两种: 手动内存管理(Manual Memory Management)自动内存管理(Garbage Collection, GC) 手动内存管理 手动内存管理是指开发…...

坑多多之AC8257 i2c1 rtc-pcf8563

pcf85163 ordering information Ordering information Package Description Version Marking code PCF85163T/1 SO8 ① SOT96-1 PF85163 PCF85163TS/1 TSSOP8 ② SOT505-1 85163 ①plastic small outline package; 8 leads;body width 3.9 mm ②plastic thin…...

UE求职Demo开发日志#32 优化#1 交互逻辑实现接口、提取Bag和Warehouse的父类

1 定义并实现交互接口 接口定义: // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "UObject/Interface.h" #include "MyInterActInterface.generated.h…...

自动化测试题

1.什么项目适合做自动化测试? 答:一般来说,适合做自动化测试的项目应该满足以下几个条件: 项目需求稳定,变更不频繁。 项目周期较长,需要反复进行回归测试。 项目功能较复杂,涉及多个模块和…...

vite配置proxy和nginx同步配置反向代理,vite的base含义

vite配置代理是为了在开发环境下联调服务器接口,如果不配置代理,开发时会出现跨域, 会在请求的url的前缀添加标识如/api,代理请求时在rewrite为"",或者rewrite为其他字符串, 项目打包部署后,需要…...

如何在 Mac 上解决 Qt Creator 安装后应用程序无法找到的问题

在安装Qt时,遇到了一些问题,尤其是在Mac上安装Qt后,发现Qt Creator没有出现在应用程序中。通过一些搜索和操作,最终解决了问题。以下是详细的记录和解决方法。 1. 安装Qt后未显示Qt Creator 安装完成Qt后,启动应用程…...

FFmpeg+SDL实现简易视频播放器

参考链接 https://blog.csdn.net/qq_26611129/article/details/98732561 https://www.cnblogs.com/Azion/p/17756274.html https://avmedia.0voice.com/?id49050 https://blog.csdn.net/qq_44825209/article/details/133760652 https://www.cnblogs.com/Azion/p/17525955.htm…...

set_intersection set_union set_difference set_symmetric_difference

std::set_intersection 用于计算两个已排序范围的交集。它将交集的结果写入到指定的输出迭代器中。 std::set_union 用于计算两个已排序范围的并集。它将并集的结果写入到指定的输出迭代器中。 std::set_difference 用于计算两个已排序范围的差集。它将差集的结果写入到指…...

webpack打包优化策略

1. 减少打包体积 减少打包文件的大小是为了提高加载速度,降低网络带宽消耗,提升用户体验。常见的减少打包体积的优化策略包括: 代码分割(Code Splitting):将代码拆分成多个小文件,让浏览器按需…...

多线程基础面试题剖析

一、线程的创建方式有几种 创建线程的方式有两种,一种是继承Thread,一种是实现Runable 在这里推荐使用实现Runable接口,因为java是单继承的,一个类继承了Thread将无法继承其他的类,而java可以实现多个接口&#xff0…...

WEB安全--SQL注入--floor报错注入

一、原理: floor()报错注入需要组合count()、rand()、group by()等函数使用,通过一些手段使数据库在处理语句时产生主键重复的报错,从而达到爆出信息的目的 二、内容: ?id-1 or (select 1 from (select count(*),concat(databa…...

resultMap 标签

resultMap 是 MyBatis 框架中用于定义数据库结果集与 Java 对象之间映射关系的核心标签。它的主要作用是解决数据库字段名与 Java 对象属性名不一致的问题,或处理复杂查询(如关联查询、嵌套对象、集合映射等)时的映射需求。 主要用途&#x…...

17.推荐系统的在线学习与实时更新

接下来就讲解推荐系统的在线学习与实时更新。推荐系统的在线学习和实时更新是为了使推荐系统能够动态地适应用户行为的变化,保持推荐结果的实时性和相关性。以下是详细的介绍和实现方法。 推荐系统的在线学习与实时更新 在线学习的概念 在线学习(Onli…...

Android设备 网络安全检测

八、网络与安全机制 6.1 网络框架对比 volley: 功能 基于HttpUrlConnection;封装了UIL图片加载框架,支持图片加载;网络请求的排序、优先级处理缓存;多级别取消请求;Activity和生命周期的联动(Activity结束生命周期同时取消所有网络请求 …...

Kotlin 2.1.0 入门教程(二十)扩展

扩展 Kotlin 提供了一种能力,无需继承类或使用像装饰器这样的设计模式,就能为类或接口扩展新的功能。这是通过一种名为扩展的特殊声明来实现的。 例如,你可以为无法修改的第三方库中的类或接口编写新的函数。这些函数可以像原类的方法一样以…...

神经网络的学习 求梯度

import sys, ossys.path.append(os.pardir) import numpy as npfrom common.functions import softmax, cross_entropy_error from common.gradient import numerical_gradient# simpleNet类 class simpleNet:def __init__(self):self.W np.random.rand(2, 3) # 随机形状为2*…...

机器学习数学基础:24.随机事件与概率

一、教程目标 本教程致力于帮助零基础或基础薄弱的学习者,全面掌握概率论与数理统计的基础公式,透彻理解核心概念,熟练学会应用解题技巧,最终能够轻松应对期末或考研考试。 二、适用人群 特别适合那些对概率论与数理统计知识了…...

【NLP 24、模型训练方式】

你的痛苦,我都心疼,想为你解决 —— 25.2.15 一、按学习范式分类 1. 监督学习(Supervised Learning) 核心思想:使用带有标签(已知输入-输出对)的数据训练模型。 常见任务:分类&…...

【鸿蒙】ArkUI-X跨平台问题集锦

系列文章目录 【鸿蒙】ArkUI-X跨平台问题集锦 文章目录 系列文章目录问题集锦1、HSP,HAR模块中 无法引入import bridge from arkui-x.bridge;2、CustomDialog 自定义弹窗中的点击事件在Android 中无任何响应;3、调用 buildRouterMode() 路由跳转页面前,…...

AI向量数据库之LanceDB快速介绍

LanceDB LanceDB 是一个开源的向量搜索数据库,具备持久化存储功能,极大地简化了嵌入向量的检索、过滤和管理。 LanceDB的主要特点 LanceDB 的主要特点包括: 生产级向量搜索:无需管理服务器。 存储、查询和过滤向量、元数据以…...

嵌入式玩具--无人机字幕

day01 01-无人机-组成结构-上 哎,好,各位,那现在呢我们一起来看一下,就是咱们接下来要做的这个小项目啊。呃,当然这个名字有很多啊,就是这种飞行器有管,它叫四旋翼飞行器的,也有叫…...