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

news2025/2/23 2:58:56

目录

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 行锁之间的区分

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

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

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

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

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

相关文章

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

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

【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 虚拟机系统…

GC 基础入门

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

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…

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

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

多线程基础面试题剖析

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

Android设备 网络安全检测

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

神经网络的学习 求梯度

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

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

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

CentOS7 安装配置FTP服务

CentOS7 安装配置FTP服务 CentOS7 安装配置FTP服务1. FTP简介2. 先行准备2.1 关闭防火墙2.2 关闭 SELinux 3.安装FTP软件包4. 创建 FTP 用户及目录4.1 创建 FTP 目录并设置权限4.2 防止 FTP 用户登录 Linux 终端4.3 创建 FTP 用户组及用户4.4 创建 FTP 可写目录 5. 配置ftp服务…

【设计模式】03-理解常见设计模式-行为型模式(专栏完结)

前言 前面我们介绍完创建型模式和创建型模式,这篇介绍最后的行为型模式,也是【设计模式】专栏的最后一篇。 一、概述 行为型模式主要用于处理对象之间的交互和职责分配,以实现更灵活的行为和更好的协作。 二、常见的行为型模式 1、观察者模…

编程题-最大子数组和(中等-重点【贪心、动态规划、分治思想的应用】)

题目: 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。 解法一(枚举法-时间复杂度超限): …

本地通过隧道连接服务器的mysql

前言 服务器上部署了 mysql,本地希望能访问该 mysql,但是又不希望 mysql 直接暴露在公网上 那么可以通过隧道连接 ssh 端口的方式进行连接 从外网看,服务器只开放了一个 ssh 端口,并没有开放 3306 监听端口 设置本地免密登录 …

2. grafana插件安装并接入zabbix

一、在线安装 如果不指定安装位置,则默认安装位置为/var/lib/grafana/plugins 插件安装完成之后需要重启grafana 命令在上一篇讲到过 //查看相关帮助 [rootlocalhost ~]# grafana-cli plugins --help //从列举中的插件过滤zabbix插件 [rootlocalhost ~]# grafana…

Linux第107步_Linux之PCF8563实验

使用PCF8563代替内核的RTC,可以降低功耗,提高时间的精度。同时有助于进一步熟悉I2C驱动的编写。 1、了解rtc_time64_to_tm()和rtc_tm_to_time64() 打开“drivers/rtc/lib.c” /* * rtc_time64_to_tm - Converts time64_t to rtc_time. * Convert seco…

功能说明并准备静态结构

功能说明并准备静态结构 <template><div class"card-container"><!-- 搜索区域 --><div class"search-container"><span class"search-label">车牌号码&#xff1a;</span><el-input clearable placeho…

[免费]SpringBoot公益众筹爱心捐赠系统【论文+源码+SQL脚本】

大家好&#xff0c;我是老师&#xff0c;看到一个不错的SpringBoot公益众筹爱心捐赠系统&#xff0c;分享下哈。 项目介绍 公益捐助平台的发展背景可以追溯到几十年前&#xff0c;当时人们已经开始通过各种渠道进行公益捐助。随着互联网的普及&#xff0c;本文旨在探讨公益事业…