佬们,黑马点评的这个乐观锁搞不懂,求教呀

就是这个,百思不得其解。个人理解它的本质是:1、通过rr默认隔离级别下给当前记录加锁,只允许当前事务update,令多个事务串行处理该记录。2、判断库存数>0,才进行库存扣减。

这跟乐观锁有什么关系呢?这不只是一个条件判断sql吗?如果说认为这是单纯靠库存字段作为乐观锁,那还是可能出现多个事务判断库存>0,并一起扣减,导致超卖,想解决该问题本质还是靠记录锁呀,记录锁不是悲观的吗

不知道我是不是哪里理解错了,大佬们教教我!!😭

全部评论
是的,借助数据库update的行锁是悲观锁,并没有用到版本号之类的机制
4 回复 分享
发布于 2024-10-21 11:44 江西
一般来说update语句是原子性的吧 不会出现多个事务判断库存大于0并且以相同的值扣减吧
2 回复 分享
发布于 2024-10-21 11:46 江西
stock严格相等的相当于代替了乐观锁里版本version的功能,但这样在高并发的时候成功率会比较低。但其实只要所有下单数不超过总stock就行,所以不必严格等于之前的stock,只要总stock大于0就可以下单。
2 回复 分享
发布于 2024-10-21 11:58 河南
同问
1 回复 分享
发布于 2024-10-21 11:44 江苏
java层面并没有解决并发安全问题,而mysql是通过mvcc机制保证不会出现并发安全问题。在并发访问同一行数据,会加行锁。
点赞 回复 分享
发布于 2024-10-21 15:44 四川
因为where条件的是索引,所以会是行锁。只不过这种情况下,并发量高的话,会消耗CPU资源,还是建议你继续往后学
点赞 回复 分享
发布于 2024-10-22 08:20 上海
你这个问题我当时还真没注意到呢。我觉得这个不是乐观锁,因为数据库肯定加了行锁
点赞 回复 分享
发布于 2024-11-09 15:20 上海

相关推荐

03-11 10:58
四川大学 Java
#牛客AI配图神器#3.10晚八点面试,第一次面大厂,面试官比我提前进了会议室,巨慌张,忘记开录制了。   一、自我介绍          没问项目   二、八股:        1、讲一下进程和线程(吟唱)        2、线程的通信方式(共享内存,锁,管道)        3、正则表达式(没系统学过)        4、jvm垃圾回收算法(引用计数,可达性分析,标记清楚和整理算法没答,答了复制算法)        5、分代垃圾回收(新生代eden to from,幸存者,老年代之间的传递,答得不好)        6、tcp和udp区别(可靠与不可靠,传输形式)        7、tcp如何实现可靠传输(重传,序号确认号,校验号)        8、https的加密方式(对称,非对称加密,ssl,tsl)        9、你觉得使用ai的优点和缺点(吟唱)       10、你在学习过程中遇到的印象深刻的困难(我答的是对于编程建立一个系统的认知)                 还有些记不起来了,八股问的很基础,可能是因为我的项目比较简单。   三、做题         linux下文件路径优化(优化../和./,用栈解决,但我一开始思路错了,太紧张了,最后没写完)  总结:八股半小时,做题半小时,面试官很有耐心,之后得重算法了,            总之还得沉淀,收获很大。
查看10道真题和解析
点赞 评论 收藏
分享
一面(25/2/26)(过)    1、自我介绍    2、介绍一下HashMap。(扩容机制、寻址、为什么扩容是二倍)。    3、如果说当前有1000个k-v结构数据放入HashMap中,最终HashMap中是什么情况。(数组桶2048个)    4、HashMap线程安全吗?哪些是线程安全的hash结构?    5、介绍一下concurrentHashMap线程安全实现的原理?(1.8之前、之后)    6、list和set集合的区别?    7、对list遍历想到几种遍历方式?(按下标、语法糖:、迭代器)    8、如果对于list中的元素遍历过程中进行删除满足一些条件的元素,你会怎么做?    9、线程池的有几个参数?    10、线程池的拒绝策略?默认的是哪种?    11、线程池的线程工厂有哪几种?默认的是哪种?    12、三个线程顺序打印a,b,c,有哪几种方式实现?    13、MySQL的分库分表有哪些方式?如何分库?主键设置?路由id?    14、MySQL集群的搭建方式?(答了主从同步,binglog、relaylog、哨兵模式)    15、redis主库挂了之后无法承接写操作,这期间的写操作的有效性和一致性如何来保证?    16、对于索引来说,字段的选择,组合索引的使用。(答重复度小的,联合索引的部分失效)    17、组合索引支持范围查询吗?三个字段第二个字段是时间字段,时间字段进行范围查询会生效吗?    18、从持久缓存中把数据加载到redis中的加载策略,如果让你来设计你有什么思路。就是从mysql到redis的这一个过程的策略?(没听明白,答了redis读取mysql的binlog日志进行数据同步)    19、redis中分布式锁的实现?(黑马点评开始吟唱)    20、OLAP和OATP了解过吗?(???)    21、事务了解过吗?这是本地事务,分布式事务了解过吗?    22、事务如何开启?(答了隔离等级和解决的问题,mysql命令开启,transaction注解开启)    23、在A方法上调用B方法,B方法上使用了transaction注解,B中的事务会生效吗?(this调用无法生效,需要使用代理调用)    24、介绍一下单例模式?(答spring的bean默认单例,比较prototype状态是非单例的)    25、spring中用到的设计模式?    26、消息队列有用过吗?知道是干什么的吗?(了解过,知道有kafka、mq,举例点评里面的秒杀优化)    手撕:5. 最长回文子串    面试官:在我这里算是一个通过,说一下你的问题:消息队列在日常使用非常频繁,要加紧补出来;缓存加载;分布式事务。对于面试实习来说整体表现算是比较优秀的。    反问:公司或者面试官您需要什么样的实习生        上手快,培养成本比较低,可以快速的帮正式成员分担一些任务。对于项目来说不一定技术复杂度越高,而是适合的比较好。二面(25/3/5)(挂)    1、自我介绍    2、把秒杀展开说一说?    3、乐观锁怎么解决超卖问题的?    4、具体是在哪一步?    5、说到分布式,被打断,就单体情况对MySQL操作,能不能解决一人一单超卖问题?    6、详细说一下,怎么判断?判断哪些字段?判断完之后成功和失败情况分别是什么样的?    7、怎么解决库存超卖?那你怎么解决主从延迟问题?查完了再去写,肯定是有延迟的?(答先判断扣减库存是否成功,成功再下单)    8、那你怎么保证这两个操作不被打断呢?(死脑子快转啊,应该是想问事务,用transaction注解,当时脑子里面在想什么啊)    9、后面扯来扯去有扯到消息队列里面了。    10、分布式锁怎么实现的?(说到误删的问题,面试官说这个问题一般不会有)    11、接着拷打巴拉巴拉,又扯回库存超卖问题了。(应该是一直想问事务)    12、后面又拷打一些场景    手撕:写一个单例模式,get方法没加static,被提醒了一下。    总结:其实问的很常规,只不过问的很细节,项目还是不熟吧,反思。
点赞 评论 收藏
分享
评论
6
58
分享

创作者周榜

更多
牛客网
牛客企业服务