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 个间隙锁,相当于锁住了全表。

相关推荐
5***E6852 小时前
【SQL】写SQL查询时,常用到的日期函数
数据库·sql
遇见火星2 小时前
CentOS7 通过源码安装 Redis
数据库·redis·缓存
Mr.朱鹏2 小时前
RocketMQ安装与部署指南
java·数据库·spring·oracle·maven·rocketmq·seata
Coder-coco2 小时前
个人健康管理|基于springboot+vue+个人健康管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·mysql·论文
K哥11252 小时前
【9天Redis系列】基础+全局命令
数据库·redis·缓存
s***46982 小时前
【玩转全栈】----Django模板语法、请求与响应
数据库·python·django
f***R82 小时前
redis分页查询
数据库·redis·缓存
g***72703 小时前
【mysql】导出导入mysql表结构或者数据
数据库·mysql
煎蛋学姐3 小时前
SSM汽车租赁管理系统mfobv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·汽车·ssm 框架·汽车租赁管理系统
w***37513 小时前
Spring 核心技术解析【纯干货版】- Ⅶ:Spring 切面编程模块 Spring-Instrument 模块精讲
前端·数据库·spring