【MySQL】一文带你搞懂MySQL中的各种锁(上)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 1.概述锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资( CPU 、RAM、 I/O )的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有 效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个 角度来说,锁对数据库而言显得尤其重要,也更加复杂。

1.概述

锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资(CPU

RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致

性、有 效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要

因素。从这个 角度来说,锁对数据库而言显得尤其重要,也更加复杂。

MySQL中的锁,按照锁的粒度分,分为以下三类:

全局锁:锁定数据库中的所有表。

表级锁:每次操作锁住整张表。

行级锁:每次操作锁住对应的行数据。

2.全局锁

2.1介绍

全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL

语句,已经更新操作的事务提交语句都将被阻塞。

其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的

完整性。

为什么全库逻辑备份,就需要加全就锁呢?

A. 我们一起先来分析一下不加全局锁,可能存在的问题。

假设在数据库中存在这样三张表: tb_stock 库存表,tb_order 订单表,tb_orderlog 订单日志表。

a15504d26f0f4b319297b969958ddc14.png

在进行数据备份时,先备份了tb_stock库存表。

然后接下来,在业务系统中,执行了下单操作,扣减库存,生成订单(更新 tb_stock 表,插入

tb_order 表)。

然后再执行备份 tb_order 表的逻辑。

业务中执行插入订单日志操作。

最后,又备份了 tb_orderlog 表。

此时备份出来的数据,是存在问题的。因为备份出来的数据, tb_stock 表与 tb_order 表的数据不一

致 ( 有最新操作的订单信息 , 但是库存数没减 ) 。

那如何来规避这种问题呢? 此时就可以借助于MySQL的全局锁来解决。

B. 再来分析一下加了全局锁后的情况

对数据库进行进行逻辑备份之前,先对整个数据库加上全局锁,一旦加了全局锁之后,其他的

DDL 、DML全部都处于阻塞状态,但是可以执行 DQL 语句,也就是处于只读状态,而数据备份就

是查询操作。 那么数据在进行逻辑备份的过程中,数据库中的数据就是不会发生变化的,这样就

保证了数据的一致性和完整性。

2.2语法

加全局锁

flush tables with read lock ;

数据备份

mysqldump -uroot –p1234 itcast > itcast.sql

2.3特点

数据库中加全局锁,是一个比较重的操作,存在以下问题:

如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。

如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志( binlog ),会导

致主从延迟。

在 InnoDB 引擎中,我们可以在备份时加上参数 --single-transaction 参数来完成不加锁的一致

性数据备份

3.表级锁

3.1介绍

表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在

MyISAM、InnoDB、BDB等存储引擎中。

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

表锁

元数据锁(meta data lockMDL

意向锁

3.2表锁

对于表锁,分为两类:

表共享读锁( read lock )

表独占写锁( write lock )

语法:

加锁: lock tables 表名 ... read/write 。

释放锁: unlock tables / 客户端断开连接 。

特点 :

A. 读锁

db720726fd3a4562ad7d3b81bda71a47.png

左侧为客户端一,对指定表加了读锁,不会影响右侧客户端二的读,但是会阻塞右侧客户端的写。

测试:

f832f77429464ae1be64db6c300b3737.png

B. 写锁

218c97d104c14b41ba0b14eb4c28dea4.png

左侧为客户端一,对指定表加了写锁,会阻塞右侧客户端的读和写。

测试:

结论: 读锁不会阻塞其他客户端的读,但是会阻塞写。写锁既会阻塞其他客户端的读,又会阻塞

其他客户端的写。

3.3元数据锁

meta data lock , 元数据锁,简写MDL

MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。MDL锁主要作

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

避免DMLDDL冲突,保证读写的正确性。

这里的元数据,大家可以简单理解为就是一张表的表结构。 也就是说,某一张表涉及到未提交的

事务时,是不能够修改这张表的表结构的。

MySQL5.5中引入了MDL,当对一张表进行增删改查的时候,加MDL读锁(共享);当对表结构进

行变更操作的时候,加MDL写锁(排他)

常见的SQL操作时,所添加的元数据锁:

演示:

当执行 SELECT 、 INSERT 、 UPDATE 、 DELETE 等语句时,添加的是元数据共

( SHARED_READ SHARED_WRITE),之间是兼容的

191208ec736544ef9960ebec3c28e54a.png

当执行SELECT语句时,添加的是元数据共享锁(SHARED_READ),会阻塞元数据排他锁

EXCLUSIVE),之间是互斥的。

我们可以通过下面的SQL,来查看数据库中的元数据锁的情况:

select object_type,object_schema,object_name,lock_type,lock_duration from
performance_schema.metadata_locks ;

我们在操作过程中,可以通过上述的SQL语句,来查看元数据锁的加锁情况。


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2天前
|
存储 SQL 关系型数据库
MYSQL--锁机制*
MYSQL--锁机制*
|
1月前
|
关系型数据库 MySQL 数据库
MySQL的行级锁锁的到底是什么?
本文简述了InnoDB的行级锁机制,包括记录锁、间隙锁和Next-Key锁。记录锁锁定索引记录,防止其他事务对相同值的行进行操作;间隙锁锁定索引记录间的间隙,防止插入。Next-Key锁是两者的结合,锁定记录及其前后间隙。在可重复读(RR)隔离级别下,加锁策略涉及Next-Key锁,但会因查询条件退化为行锁或间隙锁。MySQL的加锁机制遵循两个原则和两个优化,例如唯一索引等值查询时退化为行锁。RR级别虽能防止幻读,但也可能降低并发并引发死锁,因此有些场景下会选择读已提交(RC)级别。
MySQL的行级锁锁的到底是什么?
|
2天前
|
存储 SQL 关系型数据库
【MySQL技术内幕】6.5-锁问题、阻塞、死锁、锁升级
【MySQL技术内幕】6.5-锁问题、阻塞、死锁、锁升级
18 2
|
2天前
|
SQL 存储 算法
【MySQL技术内幕】6.4-锁的算法
【MySQL技术内幕】6.4-锁的算法
16 1
|
2天前
|
存储 SQL 关系型数据库
【MySQL技术内幕】6.3-InnoDB中的锁
【MySQL技术内幕】6.3-InnoDB中的锁
136 57
|
2天前
|
存储 SQL 关系型数据库
【MySQL技术内幕】6.1-锁、lock和latch
【MySQL技术内幕】6.1-锁、lock和latch
11 0
|
2天前
|
存储 关系型数据库 MySQL
深入研究MySQL意向锁
MySQL意向锁是一种特殊的表级锁,由InnoDB存储引擎在操作数据之前自动添加,无需用户干预。它分为意向共享锁(IS)和意向排他锁(IX)两种。意向锁的主要作用是协调行锁和表锁的关系,优化加锁策略,避免全表扫描判断是否存在行锁。意向锁之间不会冲突,但会与表级别的排他锁冲突,从而确保数据库并发访问的一致性和完整性。简而言之,意向锁提高了数据库并发操作的性能和效率。
|
3天前
|
SQL 关系型数据库 MySQL
【MySQL】事务?隔离级别?锁?详解MySQL并发控制机制
【MySQL】事务?隔离级别?锁?详解MySQL并发控制机制
13 0
|
9天前
|
SQL 关系型数据库 MySQL
MySQL数据库——锁-行级锁(行锁、间隙锁和临键锁)
MySQL数据库——锁-行级锁(行锁、间隙锁和临键锁)
13 0
|
9天前
|
SQL 存储 关系型数据库
MySQL数据库——锁-表级锁(表锁、元数据锁、意向锁)
MySQL数据库——锁-表级锁(表锁、元数据锁、意向锁)
14 0

推荐镜像

更多