作者:毕老爷666 | 来源:互联网 | 2023-10-11 13:15
我们在开发中,有时候常常去实现一些业务的功能实现,往往忽略了很多源头的东西,这也是我身边有很多业务超级强的人,但是一旦跳槽以及面试会被一些东西卡掉,你要说他真的不知道吗?其实不是,
我们在开发中,有时候常常去实现一些业务的功能实现,往往忽略了很多源头的东西,这也是我身边有很多业务超级强的人,但是一旦跳槽以及面试会被一些东西卡掉,你要说他真的不知道吗?其实不是,只是很多东西,我们常用,但是没有深入去了解或者不能再面试时候给出官方的解释(这一点我真的很烦)下面就悲观锁和乐观锁给出我的理解,当然我也是面试经常会被问到,我一般都是按照自己理解去回答 ,从来不去官方解释(每个人不一样,只要大家觉得适合自己的就行.)
一般面试官会从和几个点问你:
1.什么是锁?
2.你知道悲观锁和乐观锁?
3.你可以大概简单讲一下你的理解?
一般这三个问题是层层递进的,一般问道锁了 就心里要想了 ,千万不要不懂装懂,一定把自己最拿手最熟悉的说出来.好啦,进入正题.
一: 首先理解锁:
我的认为:锁的出现必定是因为并发才会有的东西,因为在并发的情况下,锁是来控制多个操作顺序,保证数据安全变动的一个很好的东西,锁一般最多是在: 多线程中的锁 和 数据库的锁.
比如在数据库层,一个表中同一个数据,同时多个修改操作过来,那数据库就会给表钟该行数据上锁,通常也叫行锁.我们今天说的悲观锁以及乐观锁是基于数据库层面的,跟程序中的多线程中的锁是不一样的.
悲观锁:
从字面意思来看,这家伙就是很悲观,我更喜欢叫它谨慎锁.从数据库层来讲:
1.去拿数据,会认为在此同时会有人也来动这个数据,所以它就会上锁.
2.这样,别人要是也操作这个数据,就需要它那边完事,释放锁之后.
这个机制其实对应于我们常说你的 行锁 表锁 读锁 写锁
乐观锁
就是很乐观,我一般叫大意锁.从数据库层来讲:
1.去拿数据,会认为在此同时不会有人也来动这个数据,所以它就不会上锁.
2.但是,不上锁不代表就会不负责,一般在最后更新数据的时候,一般使用版本号来处理.(问版本号如何处理?
乐观锁通常是通过在表中增加一个版本或时间戳来实现,一般常用版本。
例如:
A操作数据库数据时候
1. 从数据库中取数据时附带了版本号
2. A操作后对数据有变动最后想要将其存到表中时,这个时候会将之前取出的数据中的版本号与数据库表中最新的版本号相对比,
3. 如果两版本一样,那么说明在数据变动期间,没有其他事务对数据进行修改,此时,就允许A操作对表中的数据进行修改成功,同时会将版本号进行+1操作
4. 如果不相等,那就证明有人动过该数据,就不准A操作成立,让其重新操作一遍.
好啦,到这里 你会发现 他们两个虽然最后都保证了数据的安全,但是,如果一个数据被修改的情况很少,我们使用悲观锁每一次加锁势必耗时,所以,场景就出来了,一般的话乐观锁适用于写比较少的情况下,悲观锁适用于读比较少的情况下.