00:00
所以呢,我们已经学习了解决超慢现象的四种解决方案。那么这四种解决方案啊,我们首先呢,可以发现,那么GM等利索呀,是非常垃圾的。那这种水啊,它很难解决咱们服务外部的共享资源的并发性问题。那么如果你使用它的话,可能会带来一系列的一些问题哈。OK,那么比如说咱这个超卖现象,那MYSQ库存的超卖现象,你用它来一解决的话呢,就会存在很多问题。那么这的话呢,呃,咱们尽量不要选择使用接用本地锁,那我们可以选择一个circle悲观锁或者乐观锁。那么,这三个锁层到底如何去选择呢?OK,那么如果你追求其车性能,那么业务场景简单,并且不需要去记录数据变化前后啊前后的这样一个状态的情况下,那我们可以优先选择使用一个色。那么这个怎么说呢?哎,首先呢,一个S我们发现啊性能呢是最高的啊,啊性能最好。
01:06
那么业务场景简单怎么去理解呢?那比如说呢,我一个商品只有一个库存的情况下,那我们可以选择啊使用一个SQL。那么很多时候呀,往往我们一个商品呢,不止一个库存,那你比如说你在京东上去买东西的时候啊,比如你看中某一个商品的情况下,那你会发现呢,它显示呢,北京无货。但是你切换到上海之后呀,它会显示上海有,那说明什么,说明不同的地区啊,它有不同的仓库。那么这种时候啊,往往呢,我们就需要先去查询啊库存,先去查询符合条件的库存。那最终返回的可能是一个库存列表,那比如说你北京无货,它不一定就会显示无货,它可能呢,还可以进行调配调配啊,有些商品从其他仓库给你调配,但有些商品的话呢,可能不能调配。那我们就要先查询出符合条件的库存,那么然后呢,再去根据某些算法来去得出最佳的一个仓库,那么来给你发货,看看是不是有货,可以给你给你发货,那么这样呢,可以减库存。
02:15
那么此时啊,我们就需要先查询,然后再去更新啊,找到我们需要的那个库存之后呀,再去更新库存。那我们使用一个SQ语句呢,可能就做不到了。那并且呢,不需要记录啊,数据前后变化的情况下,什么意思呢?那比如说呢,我们在更新之前,我们可能要去记录,那么初始库存有多少。那么然后呢,变化之后呢,我需要去记录变化之后啊,是多少要去记录这种日志的情况下。那么你一个SQ语句能做到吗?也做不到,那你肯定要先查询,更新之前先查询,那查询过之后的话呢,我才知道变化之前是多少,那变化之后啊是多少,变化之后我可能还要再查询一下,我才知道是多少。
03:01
那么这的话呢,嗯,咱们嗯也做不到啊,一个四负一的情况下。那么C的话呢,咱们这个一个词口语句啊,在呃,实际使用中的话呢,往往有很多局限性。那么咱使用更多的呢,可能就是非关锁或者乐观锁啊。那么什么时候使用乐观所能啊,如果我们写的并发量较低,就多读的场景下啊,那么争抢不是很激烈的情况下,我们可以优先选择使用乐观锁。那么在高并发情况下的话呢?那我们知道啊,咱的乐观所,那么首先是干什么事情,那我们先去查询,那么查询过之后呢,得到一个版本号,版本号。那么然后的话呢,我们才能去更新,那么更新的前提是什么呢?就是班名号没有变化的情况下。那我才能去啊更新啊,再去更新库存。那么在我这个查询和更新呃过程中啊,这这在这个中间对吧,在这个中间,那么很有可能会被另外一个更新,那么给横插一脚或者给打断。
04:08
啊或者呢,给更新掉,给优先给更新更新掉了,那导致的话呢,我这个更新的时候这个版本号呀,那么和我查询这个版本号呢,诶总是可能不一样。那就会出问题。那因为呢,乐观所要咱是用应用程序来实现的,而我们的应用程序的话呢,咱们两个操作之间呢,是不具备原子性的啊,那么很有可能会被别人啊打断。那么如果呃,我们嗯,在在写比较闭化量比较高的情况下啊,那我们使用冷盘素的话,那可能咱要不停的进行re啊,进行重试,那么这个re不停的重试呀,它就会占用大量的这种CPU资源。那么反而呢,性能非常叠加。性能非常低下啊,如果在并发量不是很高的情况下,那我们使用乐观锁的话呢,它就可以呃,降低我们这种冲突的概率啊,冲突概率。
05:08
那么然后呢,他又不会锁定我们的数据资源。那么反而呢,会比较有优势,反而可以节约我们的这些CPU啊,或者线程资源。然后呢,优势就比较明显。好,那么这是咱们这个乐观锁,而且呢,乐观锁呢,还有一个优点是什么呢?它不会导致死锁啊。而我们悲观锁的话呢,是有一定概率可能会导致死锁的。OK,那么如果呃,我们这个并发量比较高。那么呃,咱一般的话呢,可能就经常导致冲突嘛,那么此时的话呢,我们就可以选择使用使用这个悲观锁哈,如果你这个时候还去使用乐板锁的话,那就可以导致不间断的进行重试。那在应用程序里面不停的进行重试,不停的进行重试就会耗费资源啊,咱前面呢已经说过了。
06:00
那么此时的话呢,我们就可以使用的使用悲观锁。那悲观所呢,其实也有自己的缺点,那比如说呢,我一个订单,我可能同时买了多个商品,哎,我一个订单一买了一个A商品,又买了一个B商品。那我有个订单二,那么订单二的话呢,同时也下订单,他买了一个B商品,又买了一个A商品。那么最早是什么情况呢?那么A呀,订单一的话呢,他可能已经呃锁好A的库存了。那么然后呢,又去啊对B库存进行操作。那么然后呢,嗯,订单二呀,先去操作的B的库存,然后又对A库存进行操作。那就出现什么情况,就出现所直径增强啊。那么订单一已经占用A的锁啊,那么订单二的话呢,同时占用了B的锁,在同一时刻,订单一占用了A的A的锁,那订单二呢,占用了B的锁。那么此时的话呢,订单二需要获取A的锁,订单一需要获取B的锁,它相互之间的话呢,就会导致死锁。
07:04
好,那么咱们这个悲观所的一个问题啊。OK,那么然后呢,咱这个北地所呀,即便北地所的话就不推不推荐使用了啊,当然的话呢,咱不同的锁呀,都有自己的一些特点啊,那我们往往呢,只能选择,只能扬长避短,选择适合我们的。那我们可以结合呃,实际的这样的一个应用场景啊,来去分析我们选择到底使用哪种锁。啊,没有最好的,也没有最佳的,只有最适合我们的啊,OK。
我来说两句