博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL面试题——锁机制
阅读量:2429 次
发布时间:2019-05-10

本文共 2303 字,大约阅读时间需要 7 分钟。

1.MySQL的锁机制

当数据库有并发事务的时候,可能会产生数据不一致,这时候就需要一些机制来保证访问的次序,锁机制就是这样的一个机制

2.隔离级别与锁的关系

  • 在未提交读级别下,读取数据不需要加共享锁
  • 在提交读级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁
  • 在重复读级别下, 读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁
  • 在可串行化下,该级别锁定整个范围的键,并一直持有锁,直到事务完成

3.按照锁的粒度分数据库锁有哪些

在关系型数据库中,可以按照锁的粒度把数据库锁分为行级锁、表级锁和页级锁,这三种锁是根据锁的粒度来区分的,行记录、表、页都是资源,锁是作用在这些资源上的,如果粒度比较小,可以增加系统的并发量,但是需要比较大的系统开销,会影响到性能,出现死锁

  • 行级锁:行级锁是MySQL中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大
  • 表级锁:表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁
  • 页级锁:页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁

MyISAM和InnoDB存储引擎使用的锁:

  • MyISAM采用表级锁
  • InnoDB采用行级锁和表级锁,默认为行级锁

4.从锁的类别上分MySQL都有哪些行级锁

从锁的类别上来讲,有共享锁和排他锁:

  • 共享锁:又叫读锁,当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加上多个
  • 排他锁:又叫做写锁。当用户要进行数据的写入时,对数据加上排他锁。排他锁只有一个,他和其他的排他锁、共享锁都相斥

这里存在一个误区:以为排他锁锁住一行数据后,其他事务就不能再读取和修改该行数据。但其实不是这样的,排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。

在InnoDB引擎中,默认的修改数据语句(update、insert、delete)都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁的类型,

  • 加排他锁:select……for update
  • 加共享锁:select……lock in share mode

总的来说:排他锁是指在给某行数据加上排他锁之后,其他事务不能再给该行数据加任何的排他锁和共享锁,但如果某条语句只是进行查询,但是不给该行加任何锁,那么该语句也是可以查询到该行数据的

5.意向锁

数据库中的数据存放是分级的,类似于表——页——记录这样的存储

在这里插入图片描述
现在举个例子:
事务A锁住了表中的一行,让这一行只能读,不能写。之后,事务B申请整个表的写锁,如果事务B申请成功,那么它将获得修改整个表的权限,这样和事务A是有冲突的,那么怎么解决这个冲突呢

在没有意向锁的情况下:

  • 判断表是否一被其他事务用表锁锁住
  • 判断表中的每一行是否已被其他行锁锁住

在步骤二中,共享锁和排他锁都是行级锁,也就是说每次事务都必须遍历整个表,才知道是否可以获取该行上的锁,效率太低,所以为了减少这样的查询,所以MySQL支持多粒度锁定

MySQL支持多粒度锁定,也就是说允许行级锁和表级锁同时存在,而为了支持这种多粒度锁定,引入了意向锁

当有了意向锁之后,那么上面的例子又会变成什么样的:

  • 判断表是否已被其他事务用表锁锁住
  • 发现表上有意向共享锁,说明表中有些行被共享行锁锁住了,因此,事务B申请表的写锁会被阻塞

意向锁分类:

  • 意向共享锁(IS):事务想要获取一张表中的某几行的共享锁
  • 意向排他锁(IX):事务想要获得一张表中的某几行的排他锁

意向锁概述:

  • 意向锁是一种表锁,分为IS和IX两种意向锁
  • 意向锁是将锁定的对象分为多个层次,意味着事务希望在更细粒度上进行加锁

6.MySQL中的InnoDB行锁的实现方式

InnoDB行锁是通过给索引上的索引项加锁来实现的,InnoDB这种行锁实现特点以为着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁,也就没有所谓的并发(因为InnoDB将整张表都锁定了)

7.InnoDB有三种行锁的算法:

  1. Record Lock:单个行记录上的锁
  2. Gap Lock:间隙锁,锁定一个范围,但不包括记录本身。GAP锁的目的,是为了防止同一事务的两次当前读,出现幻读的情况
  3. Next-Key Lock:锁定一个范围,并且锁定记录本身。对于行的查询,但是采用该方法,主要目的是解决幻读的问题

8.什么是死锁

死锁是指两个或多个事务在统一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象

常见的解决死锁的办法:

  1. 如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会
  2. 在同一事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率
  3. 对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁来减少产生死锁产生概率

9.数据库的乐观锁和悲观锁是什么

数据库管理系统中的并发控制的任务是确保在多个事务同时存取数据库中统一数据时不破坏事物的隔离性和统一性

9.1悲观锁

悲观锁的特点就是先获取锁,再进行业务操作,“悲观”就是认为获取锁是非常可能失败的,因此要先确保获取锁成功再进行业务操作,通常来讲,在数据库上的悲观锁需要数据库本身提供支持,即通过常用的select…… for update操作来实现悲观锁。悲观锁的实现方式:使用数据库中的锁机制

9.2乐观锁

假设不会发生并发冲突,只是在提交操作时检查是否违反数据完整性。在修改数据的时候把数据锁起来

转载地址:http://jhjmb.baihongyu.com/

你可能感兴趣的文章
30 张图解 | 高频面试知识点总结:面试官问我高并发服务模型哪家强?
查看>>
以太坊创始人V 神:普通人看见现在,天才看见未来
查看>>
厉害!从电影花瓶到 Wi-Fi 之母,这才是乘风破浪的姐姐!
查看>>
中国开源大爆发进行时,你没掉队吧?
查看>>
用 Python 实现抖音上的“人像动漫化”特效,原来这么简单!
查看>>
一周内咸鱼疯转 2.4W 次,最终被所有大厂封杀!
查看>>
关于鸿蒙 2.0,那些开发者不知道的一切
查看>>
Google 排名第一的语言,引数十万人关注:搞定它,技术大牛都甘拜下风
查看>>
JavaScript 爆红后,微软为何还要开发 TypeScript?
查看>>
软件开发行业,年轻与大龄程序员的生存现状
查看>>
王者荣耀活动精选 Blink 第二弹来袭!
查看>>
打开数“智”化之门,一字之差带来的思考
查看>>
阿里技术人的成长路径是什么?
查看>>
你值得拥有!更省钱地完成数据监听
查看>>
漫画 | TCP,一个悲伤的故事
查看>>
张一鸣无圈胜破圈?
查看>>
抓紧!抓紧!CSDN年终重榜福利来了~人手一份,快来投稿!!
查看>>
干货! AI 推断解决方案栈 Vitis AI 全流程独家解析
查看>>
真相了 | 敲代码时,程序员戴耳机究竟在听什么?
查看>>
回首互联网十年,我们能从八次烧钱大战中学到什么
查看>>