Mysql—锁相关面试题(全局锁,表级锁,行级锁)

文章目录

锁的分类

  • 1.全局锁

通过 flush tables read wirh lock,语句会将整个数据库处于只读状态,此时其他线程进行增删改,或者表结构的修改就会进行阻塞。全局锁主要用于全库数据备份。防止在备份整个数据时,其他线程操作数据库,使备份的数据库数据与真实数据库数据不一致。

  • 2.表级锁

表级锁分为以下几种锁:

  • 表锁:通过lock tables 语句可以对表加表锁,表锁会限制本线程以及其他线程的读写
  • 元数据锁:当我们对数据库表进行操作时,会自动加上元数据锁(MDL),对表进行CRUD时加的是MDL读锁。当对表结构进行修改时,加的是MDL写锁。元数据锁是为了防止在进行CRUD时其他线程对表结构进行变更。
  • 意向锁 :当执行更新,插入,删除操作时,需要先对表加上意向独占锁,然后对该记录加上独占锁。意向锁的目的是快速判断表里是否有记录被加锁
  • 3.行级锁:InnoDB 引擎是支持行级锁的,而 MyISAM 引擎并不支持行级锁。
  • 记录锁,锁住的是一条记录。而且记录锁是有 S 锁和 X 锁之分的,满足读写互斥,写写互斥
  • 间隙锁,只存在于可重复读隔离级别,目的是为了解决可重复读隔离级别下幻读的现象。
  • Next-Key Lock 称为临键锁,是 Record Lock + Gap Lock 的组合,锁定一个范围,并且锁定记录本身。

表锁和行锁的作用

表锁的作用:

  • 整体控制:表锁可以用来控制整个表的并发访问,当一个事务获取表锁时,其他事务无法对该表进行任何读写操作,从而保证数据的一致性。
  • 颗粒度大:表锁的颗粒度比较大,在锁定表操作时,可能会影响到表的其他操作。可能引起锁的竞争和性能问题。
  • 适用于大批量操作:表锁适合于需要大批量操作表中数据的场景,例如表的重建、大量数据的加载等。
    行锁的作用:
  • 细颗粒度控制:行锁可以精确控制对表中某行数据的访问,使得其他事务可以同时访问表中其他行数据。提高并发性能。
  • 减少锁冲突:行锁不会像表锁那样造成整个表的冲突,减少了锁竞争,提高并发访问效率。
  • 适用于频繁单行操作:行锁适用于需要频繁对表中数据单独操作的场景。

MYSQL两个线程update语句同时处理一条语句,会不会有阻塞?

会,因为 InnoDB 存储引擎实现了行级锁。当A事件对id=1这行数据进行update操作时,会对主键为1的记录添加x类型的记录锁。这样事务2对其再进行更新时会发现已经存在记录锁,进程就会阻塞。

如果2个范围不是主键或索引?还会阻塞吗?

如果2个范围查询的字段不是索引的话,那就代表 update 没有用到索引,这时候触发了全表扫描,全部索引都会加行级锁,这时候第二条 update 执行的时候,就会阻塞了。因为如果 update 没有用到索引,在扫描过程中会对索引加锁,所以全表扫描的场景下,所有记录都会被加锁,也就是这条 update 语句产生了 4 个记录锁和 5 个间隙锁,相当于锁住了全表。

相关推荐
香蕉鼠片6 分钟前
Mysql进阶篇
数据库·mysql·oracle
数厘8 分钟前
2.12 sql 数据插入(INSERT INTO)
数据库·sql·oracle
薛定e的猫咪9 分钟前
2026 年 4 月实测:OpenAI Codex 保姆级教程,从安装到 MCP、Skills 与多智能体协作
前端·数据库·人工智能
wgzrmlrm7410 分钟前
Django怎么优雅发送邮件_Python配置SMTP后端实现异步通知
jvm·数据库·python
014-code12 分钟前
Redis 删除缓存失败怎么办?重试、死信、补偿的工程化方案
数据库·redis·缓存
I love studying!!!13 分钟前
Web应用程序:用户账户
前端·数据库·sqlite
quxuexi15 分钟前
MySQL B+树与复合索引完全指南:从底层原理到高性能优化
b树·mysql·性能优化
窝子面16 分钟前
NestJs+MongoDB+Deepseek+Langchain实现ai聊天助手
javascript·数据库·人工智能·mongodb
y = xⁿ18 分钟前
【保姆级 :图解MySQL 执行全链路讲解】主键索引扫描,全局扫描,索引下推还是分不清楚?这一篇就够啦
android·mysql
zjshuster18 分钟前
流程引擎(Process Engine)简介
java·数据库·servlet