面试高频——数据库锁,乐观锁,悲观锁的理解,实现和应用场景?不敢说最好,但内容很全,一定让你看的明明白白!(处女座整理)

原创博文,欢迎转载,转载时请务必附上博文链接,感谢您的尊重。

前言

通过本篇,你将学到【乐观锁,悲观锁,共享锁,排它锁】的理解及实现,还有【CAS,AtomicInteger,synchronize,volatile 】等概念 ...

你以为自己知道乐观锁、悲观锁就万事大吉了?不不不,这只是个开始,面试官的数据库锁三连问、五连问、刨根问底问,还有使用场景都在等着你!!慌了吗??

很幸运你能发现这篇博文,我把锁相关的知识梳理一下,站在初学者的角度,用通俗易懂的讲解来诠释晦涩难懂的概念。并且,我已经查阅了大量相关博客,说白了都是一个模子,本篇也算是做个总结,取精华去糟粕,再加上自己的理解和测试Demo,一篇写完,免得大家再费力查阅其它博客,也真的没必要再查阅其它博客了。

希望各位小伙伴耐得住寂寞,花5~10分钟认真看完。如果觉得有用,别忘了点个关注;如果发现问题,欢迎在评论区及时告诉我,感谢。

数据库锁 - 思维导图

正文

只要有“并发”的地方,就有“锁”的概念。数据库是一个多用户使用的共享资源,数据库锁对保证数据一致性来说的非常重要,加锁是实现数据库并发控制的一个非常重要的技术。

数据库锁如何保证数据一致性呢?

并发环境中,当事务A对某个数据对象data进行操作前,会先向系统发出请求,对该数据进行加锁处理。加锁后,事务A就对该数据对象有了一定的控制,在该事务释放锁之前,其他事务不能再对此数据对象进行操作(具体限制哪些操作,取决于锁的类型)。

经常听人说数据库锁有很多种,巴拉巴拉恨不得把知道的都讲出来了。我真心觉得并没有那么多,概念杂糅太严重了,不同的分类依据划分的结果也必然不同,举例常用的三个:

  • 按照“锁的粒度”进行划分:行锁,页锁,表锁;
  • “程序员开发”角度进行划分;乐观锁,悲观锁;
  • “数据库管理”角度进行划分:共享锁(S锁,也叫读锁),排他锁(X锁,也叫独占锁,写锁);

没有哪个面试官会问你:“说说悲观锁和共享锁的区别?”,对不对?不是一样的概念好不啦!所以说,在学习之前先要把数据库锁的分类搞清楚,这很重要。

接下来就清晰多了,我们先从数据库引擎入手,然后按上面的三个分类一一讲解:

一、InnoDB,MyISAM

InnoDB 和 MyISAM 是 Mysql 数据库常用的两种存储引擎。在5.5之前默认使用 MyISAM 存储引擎,之后默认使用 InnoDB 存储引擎。

  • MyISAM 操作数据都是使用的表锁,更新一条记录就要锁整个表,导致性能较低,并发不高。当然,好处就是它不会出现死锁问题;
  • InnoDB 操作数据使用的是行锁,需要修改哪行,就只锁定哪行。不仅如此,InnoDB 是支持事务的,这一点是非常之重要。事务是一种高级的处理方式,可以在一些数据的增删改中进行回滚还原操作。

添加了(行级锁/表级锁)锁的数据不能被其它事务再锁定,也不被其它事务修改。是表级锁时,不管是否查询到记录,都会锁定表。

查看当前存储引擎,可以使用命令:show variables like '%storage_engine%'

二、行锁,页锁,表锁

相对于其他的数据库而言,MySQL的锁机制比较简单,最显著的特点就是不同的存储引擎支持不同的锁机制。不同数据库,不同的存储引擎,锁的特性可以大致归纳如下:

按锁的粒度划分(√: 有 -: 无)
数据库 存储引擎 行锁 页锁 表锁
Mysql MyISAM - -
BDB -
InnoDB -
Oracle -  
SQL Server -

分析锁的“开销、加锁速度、死锁、粒度、并发性能”:

  • 行锁:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高;
  • 页锁:开销和加锁速度介于表锁和行锁之间;
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Java Punk

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

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

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

打赏作者

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

抵扣说明:

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

余额充值