Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊一聊 MySQL 数据库中的那些锁

聊一聊 MySQL 数据库中的那些锁

作者头像
Bug开发工程师
发布于 2020-02-19 13:41:50
发布于 2020-02-19 13:41:50
5810
举报
文章被收录于专栏:码农沉思录码农沉思录

点击上方“码农沉思录”,选择“设为星标”

优质文章,及时送达

软件开发中,程序在高并发的情况下,为了保证一致性或者说安全性,我们通常都会通过加锁的方式来解决,在 MySQL 数据库中同样有这样的问题,一方面为了最大程度的利用数据库的并发访问,另一方面又需要保证每个用户能以一致的方式读取和修改数据,就引入了锁机制。

MySQL 数据库中,锁有很多种类型,不过大致可以分为三类:全局锁、表级锁、行级锁。这篇文章我们就简单的聊一聊这三种锁。

全局锁

全局锁是粒度最大的锁,基本上也使用不上,就像我们家的大门一样,控制着整个数据库实例。全局锁就是对整个数据库实例加锁,让整个数据库处于只读状态。

MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL),加锁之后整个数据库实例处于只读状态,有关数据操作的命令都会被挂起阻塞,例如数据更新语句、数据定义语句、更新类事务语句等等。

所以全局锁一般只用于全库备份的时候,一般只用在不支持一致性读的存储引擎做全库备份时,比如 MyISAM 这种不支持一致性读的存储引擎做全库备份时需要使用全局锁,像 InnoDB 引擎做全库备份时不需要使用全局锁。

表级锁

表级锁是 MySQL 最基本的锁策略,并且是开销最小的策略,它锁住的不是整个数据库实例,而是一张表。

表级锁跟全局锁一样,MySQL 数据库提供了加锁的命令:lock tables … read/write。例如 lock tables t1 read, t2 write; 命令,则其他线程写 t1、读写 t2 的语句都会被阻塞。同时,线程 A 在执行 unlock tables 之前,也只能执行读 t1、读写 t2 的操作。连写 t1 都不允许,自然也不能访问其他表。

我们可以使用 unlock tables 主动释放锁,如果没有使用的话,在客户端断开的时候自动释放

表级锁存在一个问题,如果一个查询正在遍历一个表中的数据,而执行期间另一个线程对这个表结构做变更,删了一列,那么查询线程拿到的结果跟表结构对不上,肯定是不行的。

为了解决这个问题,MySQL 5.5版本之后引入了元数据锁(meta data lock,MDL),MDL 是数据库自动加锁,当对一个表做增删改查操作的时候,加 MDL 读锁;当要对表做结构变更操作的时候,加 MDL 写锁

MDL 锁有以下两个特点:

  • 读锁之间不互斥,因此你可以有多个线程同时对一张表增删改查。
  • 读写锁之间、写锁之间是互斥的,用来保证变更表结构操作的安全性。因此,如果有两个线程要同时给一个表加字段,其中一个要等另一个执行完才能开始执行。

行级锁

行级锁顾名思义就是针对数据库表中的行记录加锁,行级锁可以最大程度的支持并发处理,但是同时也带来了最大的锁开销。

行级锁比较容易理解,比如事务 A 更新了一行,而这时候事务 B 也要更新同一行,则必须等事务 A 的操作完成后才能进行更新。

行级锁是由存储引擎各自实现的,也并不是所有的存储引擎都支持行级锁,比如 MyISAM 引擎就不支持行级锁,这意味着 MyISAM 存储引擎要控制并发只能使用表级锁。

InnoDB 引擎实现了行级锁,InnoDB 存储引擎中实现了两种标准的行级锁:

  • 共享锁(S Lock):允许事务读一行
  • 排它锁(X Lock):允许事务删除和更新一行

共享锁是兼容锁,就是当一个事务已经获得了行 r 的共享锁,其他事务可以立即获得行 r 的共享锁,因为读并未改变行 r 的数据。

排他锁是非兼容锁,如果有事务想获取行 r 的排他锁,若行 r 上有共享锁或者排它锁,则它必须等其他事务释放行 r 的锁。

在 InnoDB 存储引擎中,默认情况下使用的是一致性的非锁定行读,也就是通过行多版本控制器来读取行数据,我们可以显示的为行加上共享锁和排它锁,语句如下:

  • SELECT ..... FOR UPDATE:对读取的行记录加一个排它锁,其他事务想要在这些行上加任何锁都会被阻塞
  • SELECT ....... LOCK IN SHARE MODE:对读取的行记录加一个共享锁,其他事务可以向被锁定的记录加共享锁,但是想要加排它锁。则会被阻塞。

以上就是 MySQL 数据库中有关锁的分享,希望这篇文章对您的学习或者工作有所帮助,如果您觉得文章有用,还请帮忙转发转发,谢谢。

祝大家在2020年工作顺路,家庭幸福,合家团圆

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农沉思录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL 锁
全局锁主要应用于做全库逻辑备份,这样在备份数据库期间,不会因为数据或表结构的更新,而出现备份文件的数据与预期的不一样。
恋喵大鲤鱼
2023/10/23
3040
MySQL锁、加锁机制(超详细)—— 锁分类、全局锁、共享锁、排他锁;表锁、元数据锁、意向锁;行锁、间隙锁、临键锁;乐观锁、悲观锁
客户端发往MySQL的一条条SQL语句,实际上都可以理解成一个个单独的事务(一条sql语句默认就是一个事务)。而事务是基于数据库连接的,每个数据库连接在MySQL中,又会用一条工作线程来维护,也意味着一个事务的执行,本质上就是一条工作线程在执行,当出现多个事务同时执行时,这种情况则被称之为并发事务,所谓的并发事务也就是指多条线程并发执行。
寻求出路的程序媛
2024/06/24
19.3K5
MySQL锁、加锁机制(超详细)—— 锁分类、全局锁、共享锁、排他锁;表锁、元数据锁、意向锁;行锁、间隙锁、临键锁;乐观锁、悲观锁
MySQL高级9-锁
  锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除了传统的计算资源(CPU、RAM、i/O)的挣用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素,从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。
Se7eN_HOU
2023/09/06
2570
MySQL高级9-锁
MySQL 锁机制(上) -- 全局锁与表级锁
数据库作为多用户共享的资源中心,总是存在着竞争条件,显然,加锁是最为简单的一种保证竞争条件安全性的措施。 那么,mysql 锁是如何实现的,又有哪些分类?本文将为您详细讲述。
用户3147702
2022/06/27
2.2K0
MySQL 锁机制(上) -- 全局锁与表级锁
MySQL锁系列
全局锁主要应用于做全库逻辑备份,这样在备份数据库期间,不会因为数据或表结构的更新,而出现备份文件的数据与预期的不一样。
AiDBA宝典
2023/04/26
2990
MySQL锁系列
⑩⑦【MySQL】锁:全局锁、表级锁、行级锁
①表锁 :表共享读锁(read lock) / 表独享写锁(write lock)
.29.
2023/11/21
6280
⑩⑦【MySQL】锁:全局锁、表级锁、行级锁
再谈mysql锁机制及原理—锁的诠释
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
周陆军
2019/10/20
1.6K0
MySQL 锁
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。
用户9615083
2022/12/25
1.3K0
MySQL 锁
一文搞懂数据库中的“锁”(图文详解)
全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML、DDL语句,已经更新操作的事务提交语句都将被阻塞
changwoo
2024/03/29
5.5K1
一文搞懂数据库中的“锁”(图文详解)
Mysql的各种锁——Mysql系列(三)
https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-shared-exclusive-locks
翰墨飘香
2023/06/11
5620
看完MySQL全局锁和表锁,你废了吗?
FTWRL执行时,要刷脏页数据到磁盘,因为要保持数据一致性,所以执行FTWRL的时机是所有事务都提交完毕后。
JavaEdge
2021/12/07
8900
看完MySQL全局锁和表锁,你废了吗?
【MySQL】一文带你搞懂MySQL中的各种锁
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资( CPU 、
陶然同学
2023/10/14
1.9K0
【MySQL】一文带你搞懂MySQL中的各种锁
MySQL 数据库中的锁
MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。
星尘的一个朋友
2021/03/20
5.2K0
MySQL中的索引和锁
索引常见的类型有哈希索引,有序数组索引,二叉树索引,跳表等等。本文主要探讨 MySQL 的默认存储引擎 InnoDB 的索引结构。
用户1212940
2019/11/02
1.1K0
对于MySQL你必须要了解的锁知识
MySQL 的锁按照范围可以分为全局锁、表锁、行锁,其中行锁是由数据库引擎实现的,并不是所有的引擎都提供行锁,MyISAM 就不支持行锁,所以文章介绍行锁会以InnoDB引擎为例来介绍行锁。
本人秃顶程序员
2019/04/29
7250
对于MySQL你必须要了解的锁知识
MySQL十三:小一万字+14张图读懂锁机制
MySQL中的锁有很多种,各种锁应用在不同的地方。「MySQL依靠锁机制可以让多个事务更新一行数据的时候串行化」。
云扬四海
2022/09/26
4520
SQL锁总结
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。
海盗船长
2023/10/11
2320
SQL锁总结
《MySQL必懂系列》全局锁、表级锁、行锁
MySQL提供了不同等级的锁,按限制能力的划分,分为全局锁、表锁、行锁。本文会描述不同锁的应用场景与实现原理。
全栈程序员站长
2022/07/18
1.5K0
吃瓜是需要底层数据库事务锁支撑的
锁是MySQL在服务器层和存储引擎层的并发控制,锁可以保证数据并发访问的一致性、有效性;
Liusy
2021/02/01
5040
MySQL数据库:锁机制
当数据库中多个事务并发存取同一数据的时候,若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。MySQL锁机制的基本工作原理就是,事务在修改数据库之前,需要先获得相应的锁,获得锁的事务才可以修改数据;在该事务操作期间,这部分的数据是锁定,其他事务如果需要修改数据,需要等待当前事务提交或回滚后释放锁。
全栈程序员站长
2022/06/29
1.6K0
MySQL数据库:锁机制
相关推荐
MySQL 锁
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档