首页 > 数据库 >MySQL锁-行级锁、表级锁、全局锁

MySQL锁-行级锁、表级锁、全局锁

时间:2024-12-19 23:56:31浏览次数:6  
标签:行级 事务 加锁 行锁 间隙 索引 意向锁 MySQL 表级

MySQL锁机制

MySQL中锁主要分为以下几种:

  • 全局锁
  • 表级锁
    • 表锁
    • 元数据锁
    • 意向锁
  • 行级锁
    • 行锁
    • 间隙锁
    • 临建锁


首先需要了解共享锁和排他锁

共享锁和排他锁

在 MySQL 中锁可以分为两大类,分别是shared (S)locks和 exclusive (X) locks。

  • S锁,称为共享锁(也被称为读锁),事务在读取记录的时候获取S锁,它允许多个事务同时获取S锁,互相之间不会冲突。
  • X锁,称为独占锁(排他锁,也被称为写锁),事务在修改记录的时候获取X锁,且只允许一个事务获取X锁,其它事务需要阻塞等待

S 锁之间不冲突,X锁则为独占锁,所以 X之间会冲突,X和S也会冲突。

全局锁(可以读不能写)

全库数据备份时需要用到全局锁(锁的范围-整个数据库)

# 开启全局锁
flush tables with read lock;

# 使用mysqldump进行数据备份  控制台命令
mysqldump -uroot -p123456 数据库名 > 数据库文件名.sql

# 释放全局锁
unlock tables;


由于全局锁性能较差,如何想数据备份不加全局锁,也可以使用如下命令

# 在InnoDB我们可以在备份时加上参数 --single-transaction 参数来完成不加锁的一致性数据备份 (基于快照实现)

mysqldump --single-transaction -uroot -p123456 数据库名 > 数据库文件名.sql

表级锁

表级锁分为:表锁、元数据锁、意向锁

表锁

表锁的范围 - 整张表
读锁read (所有客户端都可以读,不可以写)

写锁write (加锁所在的客户端及可以读,也可以写;其他客户端所有操作都无法进行)

# 加锁
lock tables 表名 read/write;

# 释放锁 (客户端关闭自动释放锁)
unlock tables;

元数据锁

元数据锁(meta data lock,MDL),元数据锁也分为读锁和写锁:
MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。
MDL锁主要作用是维护元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。为了避免DML与DDL冲突,保证读写的正确性。

在MySQL5.5中引入了MDL,为了避免DML与DDL冲突

  • 对一张表进行增删改查(DML) 的时候,加MDL读锁(共享),阻止其他事务对表结构的修改
  • 对表结构进行变更(DDL) 操作的时候,加MDL写锁(排他),阻止其他事务对表的操作

维护元数据的数据一致性
确保在执行 DDL操作(如 CREATE TABLE、DROP TABLE、ALTER TABLE)时,元数据不会被其他事务同时修改。

下面SQL语句所加的元数据锁
在这里插入图片描述

意向锁

为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减
少表锁的检查,只需要判断表锁和意向锁是否兼容

  • 意向共享锁(IS):与表锁共享锁(read)兼容,与表锁排它锁(write)互斥,
  • 意向排他锁(IX):与表锁共享锁(read)及排它锁(write)都互斥。意向锁之间不会互斥。

意向锁是一种 MySQL 数据库中的锁,用于表级锁协调多个行级锁的使用。在表级锁定一个表之前,MSQL 需要先获得一个意向锁,以表明要获取的锁类型(读锁或写锁),避免其他事务锁定整个表或锁定一部分表时引发死锁。

意向锁是一种轻量级锁,它不会影响其他事务的读操作,只有在某个事务要对表进行写操作时才会加上意向锁,而其他事务在读取表时只需要获取读锁,不需要等待意向锁的释放。
意向锁可以提高数据库并发性能,防止死锁的发生。它是表级锁,而不是行级锁。

查看意向锁及行锁的加锁情况:

select object_schema,object_name,index_name,lock_type, lock_mode,lock_data from performance_schema.data_locks;

行级锁

行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中。
InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁

对于行级锁,主要分为以下三类:

  • 行锁(Record Lock):锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持
  • 间隙锁(Gaplock):锁定索引记录间隙(不含该记录),确保率引记录间不变,防止其他事务在这个间隙进行insert,产生幻读,在RR隔离级别下都支持(开区间锁住两个索引间的间隙)
  • 临键锁(Next-KeyLock):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。(可以理解为左开右闭的区间,包含的前面的间隙和右边索引所在的数据)

行锁

行锁也分为读锁和写锁

  • 针对唯一(主键)索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。(行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁
  • InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁
    在这里插入图片描述
间隙锁和临建锁

默认情况下,InnoDB在 REPEATABLE READ(RR)事务隔离级别运行,InnoDB使用 next-key锁进行搜索和索引扫描,以防止幻读。

  1. 索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁。
  2. 索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询需求时,next-keylock退化为间隙锁。(因为已经遍历到最后一个了,而且不满足,所以不需要加行锁了,临建锁退化成间隙锁)
  3. 索引上的范围查询(唯一索引)–会访问到不满足条件的第一个值为止

标签:行级,事务,加锁,行锁,间隙,索引,意向锁,MySQL,表级
From: https://blog.csdn.net/wy02_/article/details/144596634

相关文章

  • 【零基础学Mysql】一文了解数据库及其常用数据类型
    大家好,我是whisperrr.文章目录一.了解数据库1.1数据库三层结构-破除MySQL神秘1.2创建数据库1.3查看、删除数据库1.4备份恢复数据库二.Mysql常用数据类型(列类型)2.1数值型(整数)的基本使用2.1.1如何定义一个有符号的整数2.1.2如何定义一个无符号的整数2.2bit(位)类......
  • mysql期末大题满分指南(ER图关系模型+mysql代码题)
    好久没有写博客最近开始期末周,完成期末项目、答辩、准备笔试考试。所以也是信息收集学了将就1/2 昨天晚上刚刚结束了mysql期末考试就此来写一个博客。题型:一、选择、填空、判断、简答题推荐这位老哥的题库非常全考试做选择题和填空题都非常顺利。预计选择、填空、判......
  • 225Python大学生社团管理系统(Pycharm Flask Django Vue mysql)
    文章目录项目介绍和开发技术介绍具体实现截图开发技术开发与测试:设计思路系统测试可行性分析核心代码部分展示文章目录/写作提纲参考源码/演示视频获取方式项目介绍和开发技术介绍对于网站的前台设计,要保证主界面的整洁有序,能够抓住人的眼球,不会产生视觉疲劳,更重要......
  • 12、MySQL插入10万条数据
    createdatabaselogin;uselogin;createtableusers(idintprimarykeyauto_increment,namevarchar(20)notnull,passwordvarchar(50)notnull);createtablelogin_times(namevarchar(20)primarykey,count_timesint);createtriggertrigger_countafterins......
  • MYSQL
    jdbc:用于Java程序访问数据库的API;原理:包含数据库驱动,连接数据库,创建操作对象,执行SQL语句,处理查询结果,释放查询资源等(使用socket连接数据库,获取statement实例执行sql语句)执行过程中,每个步骤都会生成一个虚拟表,这个虚拟表将作为下一个执行步骤的输入,最后产生的虚拟币将作......
  • MySQL数据库
    数据库开发-MySQL接下来,就来演示一下,通过MySQL的客户端命令行,如何来连接服务器上部署的MySQL:mysql-u用户名-p密码[-h数据库服务器的IP地址-P端口号]在Mysql数据库服务器当中存储数据,你需要:先去创建数据库(可以创建多个数据库,之间是相互独立的)在数据库下再去创建数据表(......
  • 一文彻底弄懂MySQL的各个存储引擎,InnoDB、MyISAM、Memory、CSV、Archive、Merge、Fede
    MySQL中的存储引擎是其数据库管理系统的核心模块,用于处理不同类型的数据存储和检索操作。每种存储引擎都有自己的特点,适用于不同类型的应用场景。MySQL最常用的存储引擎包括 InnoDB、MyISAM、Memory、CSV、Archive、Merge、Federated、NDB 等。以下是对MySQL存储引擎的详......
  • mysql mysqldump 定时备份
    mysqldump方式备份 Windows 一、创建bat任务脚本⚠️内容背后不能有中文空格,否则会运行失败新建bat脚本复制以下内容,安装自己的需求对内容进行修改@echooff::命令行窗口中显示此条信息@echo开始备份数据库::将hour设置为此刻小时位的时间,从0位置开始取2位seth......
  • 【基于Windows安装配置nacos 2.4.3、开机自启动、启动默认单机模式、单机模式匹配MySQ
    【基于Windows安装配置nacos2.4.3、开机自启动、启动默认单机模式、单机模式匹配MySQL】前言一、下载安装Windows版nacos2.4.3二、配置nacos完成自启单机模式三、设置Windows开机自启四、匹配MySQL数据库总结提示:可以在官网选择下载符合自己要求的版本前言......
  • idea mysql sharding分表分库
    水平分表引入jar包<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0-RC1</version></dependency><dependency><gr......