MySQL面试题-锁(答案版)

本文详细介绍了MySQL中的全局锁、表级锁(包括共享锁、独占锁和意向锁)、行级锁(如RecordLock、GapLock和Next-KeyLock)以及AUTO-INC锁。讨论了各种锁的使用场景、优缺点和注意事项,特别是如何处理并发操作中的幻读和数据一致性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

1、MySQL 有哪些锁?

(1)全局锁

加了全局锁之后,整个数据库就处于只读状态了,这时其他线程执行以下操作,都会被阻塞:

对数据的增删改操作,比如 insert、delete、update等语句;
对表结构的更改操作,比如 alter table、drop table 等语句。

// 加全局锁
flush tables with read lock
// 解锁
unlock tables

使用场景:全局锁主要应用于做全库逻辑备份,这样在备份数据库期间,不会因为数据或表结构的更新,而出现备份文件的数据与预期的不一样。

缺点:加上全局锁,意味着整个数据库都是只读状态。那么如果数据库里有很多数据,备份就会花费很多的时间,关键是备份期间,业务只能读数据,而不能更新数据,这样会造成业务停滞。

如果数据库的引擎支持的事务支持可重复读的隔离级别,那么在备份数据库之前先开启事务,会先创建 Read View,然后整个事务执行期间都在用这个 Read View,而且由于 MVCC 的支持,备份期间业务依然可以对数据进行更新操作。
因为在可重复读的隔离级别下,即使其他事务更新了表的数据,也不会影响备份数据库时的 Read View,这就是事务四大特性中的隔离性,这样备份期间备份的数据一直是在开启事务时的数据。

(2)表级锁

2-1:表锁
表锁除了会限制别的线程的读写外,也会限制本线程接下来的读写操作。

//表级别的共享锁,也就是读锁;
lock tables t_student read;
//表级别的独占锁,也就是写锁;
lock tables t_stuent write;
// 解锁
unlock tables;
// 另外,当会话退出后,也会释放所有表锁。

2-2:元素据锁
我们不需要显示的使用 MDL,因为当我们对数据库表进行操作时,会自动给这个表加上 MDL:

01.对一张表进行 CRUD 操作时,加的是 MDL 读锁;
02.对一张表做结构变更操作的时候,加的是 MDL 写锁;

MDL 是在事务提交后才会释放,这意味着事务执行期间,MDL 是一直持有的。

申请 MD

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你不懂、、、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值