mysql中关于锁的相关面试题

1.为什么要加锁?

当多个用户并发存取数据时,在数据库中会产生多个事务同时存取同一数据的情况,若不对并发操作加以控制就可能导致读取和存储的数据不正确,破坏数据的一致性,加锁的目的就是为了保证数据库的完整性和一致性。

2.按照锁的粒度来分,数据库锁有哪些?

在关系型数据库中可以分为:表级锁,页级锁,行级锁

表级锁:是mysql中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,实现简单,资源消耗较少,大部分mysql引擎支持,如InnoDB,Myisam。表级锁的开销小,加锁快,不会出现死锁;但锁的粒度大,发生锁冲突的概率高,并发度最低。表级锁又分为共享锁(读锁)与排他锁(写锁)。

按照锁的类别来分,数据库有:

    共享锁:又称为读锁,当用户要进行数据的读取时,对数据加上共享锁,共享锁可以加上多个

    排他锁:又称为写锁,当用户要进行数据的写入时,对数据加上排他锁,排他锁只可以加一个,

                  它与其他排他锁,共享锁都相斥。

页级锁:页级锁是mysql中所粒度介于表级锁和行级锁之间的一种锁。表级锁速度快,但冲突多,行级锁冲突少,但速度慢。页级锁折中介于两者之间,一次锁定相邻的一组记录。BDB引擎支持页级锁。开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

行级锁:行级锁是mysql中所粒度最小的一种锁,表示对当前操作的行进行加锁,锁的粒度小,加锁开销大,锁冲突概率最低,并发度最高。InnoDB引擎支持。

3.什么是数据库的乐观锁和悲观锁?如何实现的?

数据库的管理系统中的并发控制的任务是确保多个事务同时存取数据中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性,乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。

  • 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。在修改数据的时候把事务锁起来,通过version的方式来进行锁定。实现方式:一般会使用版本号机制或CAS算法实现。

  • 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候就把事务锁起来,直到提交事务。实现方式:使用数据库中的锁机制

应用场景:乐观锁常用于多读的场景下,悲观锁常用于多写的场景下。

4.InnoDB引擎的行锁是怎么实现的?

InnoDB是基于索引来完成行锁

例: select * from tab_with_index where id = 1 for update;

for update 可以根据条件来完成行锁锁定,并且 id 是有索引键的列,如果 id 不是索引键那么InnoDB将完成表锁,并发将无从谈起

5.什么是死锁?如何解决?

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。通俗来讲:有一块蛋糕,两个人一人抢到一半,并且这两个人还在要求对方将自己手里的另一半也给自己,相互拉扯。

常见的解决死锁的方法

1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低思索的机会。

2、在同一事物中尽可能做到一次锁定所需要的所有资源,减少死锁产生的概率。

3、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;

如果业务处理不好可以用分布式事务锁或者使用乐观锁

6.隔离级别与锁的关系

在读未提交级别下,读取数据不需要加共享锁,这样就不会与被修改的数据上的排他锁冲突

在读已提交级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁;

在可重复读级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁。

可串行化是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成

7.优化锁方面的意见?

  • 使用较低的隔离级别
  • 设计索引,尽量使用索引去访问数据,加锁更加精确,从而减少锁冲突
  • 选择合理的事务大小,给记录显示加锁时,最好一次性请求足够级别的锁。列如,修改数据的话,最好申请排他锁,而不是先申请共享锁,修改时再申请排他锁,这样会导致死锁
  • 不同的程序访问一组表的时候,应尽量约定一个相同的顺序访问各表,对于一个表而言,尽可能的固定顺序的获取表中的行。这样大大的减少死锁的机会。
  • 尽量使用相等条件访问数据,这样可以避免间隙锁对并发插入的影响
  • 不要申请超过实际需要的锁级别
  • 数据查询的时候不是必要,不要使用加锁。MySQL的MVCC可以实现事务中的查询不用加锁,优化事务性能:MVCC只在committed read(读提交)和 repeatable read (可重复读)两种隔离级别
  • 对于特定的事务,可以使用表锁来提高处理速度活着减少死锁的可能
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值