Mysql锁之——全局锁、表锁

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Mysql锁之——全局锁、表锁

为什么要加锁

锁的出现,主要是为了解决并发问题。在多用户同时访问的时候,数据库需要合理的控制这部分共享资源的访问策略。锁就是实现这些访问策略的数据结构。

分类

根据锁的范围,大致可分为:全局锁、表锁和行锁。这篇文章先介绍全局锁和表锁,行锁会在后续文章单独介绍。

全局锁

全局锁就是对整个数据库实例进行加锁,有什么用呢?

将整个数据库设置为只读状态,用来做全库的逻辑备份(就是把整个数据库里面的每个表都select出来,存成文本)。Mysql提供了一种加全局读锁的方法:Flush tables with read lock(FTWRL)。整个数据库状态为只读,听起来就很危险:

  • 如果在主库上做备份,在备份期间主库不能执行任何更新,业务基本停摆;
  • 如果在备库上做备份,在备份期间从库不能执行主库同步过来的 binlog,导致主从延迟。

说明:一主一从、一主多从架构主要用来防止单点故障引起的业务不可用。

我们来看看,若是在备份期间,不加锁的情况下,会有什么问题:假设某用户A,有一张账户表account,有一张课程表course。

  1. 情形一:某个时刻,账户表account的余额1000块,已经被select出来保存起来,课程表还没备份。此时,用户A买了一门课程,账户余额减100,课程表增加一门课程。之后再备份课程表,最终备份的结果就是:用户A的账户还是1000块,课程表已经加了一门课。如果后面用这个备份来恢复数据,那么A用户就发现自己赚了
  2. 情形二:与情形一相反,先备份课程表,用户再花钱买课,再备份账户表,就会发现:账户已经扣钱了,但是没买到课。如果后面用这个备份来恢复数据,那么A用户就发现自己血亏。

也就是说,如果不加锁,备份系统备份得到的库有问题。原因是备份系统的视图的不一致导致的。说到视图,在可重复读隔离级别下,是可以拿到一致性视图的。一致性视图是好,但是前提是引擎得支持可重复读隔离级别。对于Myisam这种不支持事务的引擎来说,如果备份的过程中有更新,就破坏了备份的一致性,只能使用FTWRL命令了。

表锁

Mysql的表锁有三种:表锁、元数据锁(Meta Data Lock, MDL)、意向锁。

表锁:上锁语法:lock tables 表名 read/write。 解锁语法:unlock tables

可以看到,当加了读锁之后客户端都可以读,但是都不可以改,注意自己也不能改

可以看到,当加了写锁之后的客户端可读可写,其他客户端读写都会被阻塞

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

元数据锁:MDL是在访问一张表的时候会自动加上,无需显式使用。用来解决增删改查(DML)语句和修改表结构的语句的冲突问题,保证数据读写的正确性。在Mysql 5.5中引入了MDL。在对一张表做增删改查的时候会加MDL读锁,修改表结构时会加MDL写锁。

看下面这个例子:

  • session A开启事务,读取一行,加MDL读锁;
  • session B再读取一行,这条语句可以正常读取,因为MDL读锁之间不互斥;
  • session C想增加字段,需要加MDL写锁,读写锁互斥,所以session C阻塞等待;
  • session D想继续读取,因为session C自己阻塞还不要紧,还会导致后面的读、写操作都会阻塞;
    从业务看就是整张表都不可读写。若是这张表上刚好有频繁的查询请求,若是长时间不返回,客户端有重试机制,也就是超时之后会再起session请求,导致这个库的线程很快爆满!
    补充说明,给一张表增加字段、修改字段或者增加索引,都需要走全表扫描。为什么呢?因为索引要根据每一行的记录值来创建。增加字段和修改字段都需要修改对应列的数据,所以也会走全表扫描。

小结:事务中的MDL锁,是在语句执行的时候申请,但是语句执行结束后不会立马释放,而是等事务提交了才释放。所以,我们在给表添加字段的时候,应该尽可能的避免长事务,事务不提交就会一直占着MDL锁。

在Mysql information_schema 库的 innodb_trx 表,你可以查到当前执行中的事务,如果你要做DDL的表刚好有长事务在执行,考虑先暂停 DDL 或者 kill 掉这个长事务。

思考题:假设你要做DDL的表是一个热点表,虽然数据量不大,但是这张表上的请求很频繁,你又不得不做DDL,怎么做?

这个时候kill未必有用了,因为kill了,又会有新的请求过来。理想的做法是在alter table 语句中加上超时时间,如果在这个时间内拿到写锁最好,拿不到不要阻塞后面的语句。

意向锁:分为意向共享锁(IS)和意向排它锁(IX)。主要是InnoDB引擎为了实现多粒度锁共存,从而引入了意向锁。

意向共享锁,事务想要给数据库某些行加共享锁,需要先加上意向共享锁

意向互斥锁,事务想要给数据库某些行加互斥锁,需要先加上意向互斥锁

举例: 假设我们事务A执行以下语句:

mysql> update stu set age=55 where id = 1;

InnoDB除了在这行数据上加X锁,还对所在的表stu加上了意向排它锁。

这个时候,如果这时另外一个事务B,对表stu有表级别的操作,在执行alter table、drop table、lock tables等这些操作前,都会先检查表stu是否存在意向排他锁O(1)时间复杂度,如果有,则阻塞等待。如果没有意向锁,需要一行一行的扫描全表看是否有锁冲突,判断时间复杂度O(n)。

笔记参考于极客时间《MySQL实战45讲》

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
MySQL 锁
MySQL里常见的几种锁
53 3
|
1月前
|
存储 关系型数据库 MySQL
优化 MySQL 的锁机制以提高并发性能
【10月更文挑战第16天】优化 MySQL 锁机制需要综合考虑多个因素,根据具体的应用场景和需求进行针对性的调整。通过不断地优化和改进,可以提高数据库的并发性能,提升系统的整体效率。
68 1
|
1月前
|
关系型数据库 MySQL Java
MySQL数据锁:Record Lock,Gap Lock 和 Next-Key Lock
本文基于 MySQL 8.0.30 版本及 InnoDB 引擎,深入解析三种行锁机制:记录锁(Record Lock)、间隙锁(Gap Lock)和临键锁(Next-key Lock)。记录锁锁定索引记录,确保事务唯一修改;间隙锁锁定索引间的间隙,防止新记录插入;临键锁结合两者,锁定范围并记录自身,有效避免幻读现象。通过具体示例展示了不同锁的作用机制及其在并发控制中的应用。
149 2
|
1月前
|
存储 关系型数据库 MySQL
MySQL数据库锁:共享锁和独占锁
本文详细介绍了`InnoDB`存储引擎中的两种行级别锁:共享锁(S锁)与排他锁(X锁)。通过具体示例展示了这两种锁的工作机制及其在`InnoDB`与`MyISAM`引擎中的表现差异。文章还提供了锁的兼容性矩阵,帮助读者更好地理解锁之间的互斥关系。最后总结了两种锁的特点及适用场景。适合希望深入了解`MySQL`并发控制机制的读者阅读。
58 1
|
2月前
|
监控 关系型数据库 MySQL
MySQL锁机制与解决死锁问题
MySQL锁机制与解决死锁问题
294 5
|
1月前
|
存储 关系型数据库 MySQL
MySQL锁,锁的到底是什么?
【10月更文挑战第16天】MySQL 锁锁定的是与数据和资源相关的对象,其目的是为了保证数据的一致性、避免冲突,并在并发环境下合理协调事务或操作的执行。理解锁的对象和意义对于优化数据库性能、处理并发问题至关重要。
63 0
|
1月前
|
关系型数据库 MySQL 数据库
mysql锁详解
通过理解并合理运用MySQL中的锁机制,开发者可以有效管理数据库并发访问,平衡性能与数据一致性需求。更多关于MySQL锁的深入探讨和最佳实践,请参考专业的数据库管理资源[[深入MySQL锁机制详解
40 0
|
2月前
|
关系型数据库 MySQL 数据库
Mysql的锁
本文介绍了MySQL中表级锁和行级锁的区别,其中MyISAM仅支持表级锁,而InnoDB支持表级锁和行级锁,默认为行级锁。表级锁锁定整个表,实现简单,资源消耗少,但并发度低;行级锁仅锁定相关记录,减少冲突,提高并发度,但加锁开销大。此外,还介绍了共享锁和排他锁的概念及意向锁的作用。
|
2月前
|
存储 SQL 关系型数据库
MySQL 的锁机制,那么多的锁,该怎么区分?
MySQL 的锁机制,那么多的锁,该怎么区分?
43 0
|
3月前
|
关系型数据库 MySQL 数据库
MySQL MVCC和间隙锁有什么区别?
【8月更文挑战第24天】MySQL MVCC和间隙锁有什么区别?
100 0

热门文章

最新文章

下一篇
无影云桌面