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

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

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

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

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

相关推荐

刚面了北京一个中小厂(100-499),先就简历上写的项目要点进行了拷打,然后问了一些八股,接着他就让我打开屏幕共享演示一个项目。到这我心里就慌了,因为这一个月以来一直在背八股,刷算法,项目也只是掌握了那几个核心的技术点,项目源文件很久没碰过也没启动过。果不其然,忘了开mq,又忘了开redis,项目连着启动失败了两次,面试官就让我直接开始讲代码。这里还有个难绷的点,我光改了简历上写的项目名,但ide里还赫然写着sky–takeout,hm–dianping,甚至还有黑马项目文件里自带的一些注释😱😱😱(主要当时压根没想过后面会有让演示项目的,自己这块也是没考虑充分)整个过程中,面试官先让我讲项目架构,每一块是做什么的,然后让我挑一个业务逻辑从头到尾讲一遍,一条一条源码问。(这里我讲的黑马点评里那个防超卖,一人一单的业务)讲完业务逻辑后让我打开数据库定义语言,解释每一个字段、关键字的含义。整个过程能感受到面试官态度的转变。最后说整个业务逻辑太简单了,代码编写不太规范,说网上的项目学习时要有自己的理解。没有反问环节(感觉应该是凉了)。第一次遇到这种情况,太紧张了,整体过程不太流畅,有点磕绊,还有就是太长时间没看,有些业务代码找了半天。有点标题党了,其实也不是烂大街项目的问题,感觉面试官是想考察对项目的理解和熟悉程度,然而我最近恰好忽视了这一点,光顾着项目里的一些核心技术点实现,反而对项目的整体细节把握不够。
点赞 评论 收藏
分享
06-14 13:13
门头沟学院 Java
程序员牛肉:其实你这个问题千言万语是一句话:如何保证Redis跟数据库的一致性嘛。 各大公司都是有那种对账的。数据一致性校验平台这种中间件来去确保二者之间数据的一致性。 你可以这样理解,就是我们在这个平台上面呢会基于代码呢去实现一个规则,就是说我去监听数据库的binlog日志,然后会对binlog日志进行实时解析,跟目标数据源进行对比,以此呢来判断数据是否一致。 那放到你这个场景里面呢,就是说每当一个用户的优惠券落库的时候呢,那它会产生对应的log日志,我们就把这个日志捞出来,从log日志里面取出信息拼接Redis的对应key,查一遍Redis。 如果radius里面有数据,那就说明c口跟log的数据是一致的,如果没有就说明他们两个有一端不可信嘛,那你就选择可信的一端,对另外一端进行数据补偿就好。
如果再来一次,你还会选择...
点赞 评论 收藏
分享
06-15 16:08
河南大学 Java
查看19道真题和解析
点赞 评论 收藏
分享
评论
7
65
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务