【大厂面试题】乐观锁会导致线上崩盘吗?

作者: 程序员鸡翅分类: 软件应用 发布时间: 2022-07-12 22:12:21 浏览:5151 次

【大厂面试题】乐观锁会导致线上崩盘吗?

麦丁布斯:
我有个问题,为什么乐观锁一定要用版本号实现,不用版本号不行吗?比如说这个场景,我在更新的时候如果是加佣金直接set加就行了,如果是减佣金,在where条件中加上佣金总量>需要减少的佣金作为条件判断难道就不行吗?@经典鸡翅

【回复】你说的应该不是视频里说的情况,换一种扣减库存可能和相似。卖一个扣一个库存,用乐观锁是update 库存减一 where 库存等于原先查询的库存。可以改成update 库存减一 where 库存>0
【回复】set的时候如果不加版本号,别的线程优先提交了,当前set的值就出错了
我的故事都是关于你呀a:
消息驱动和分布式锁,具体实现是不是把变更佣金的操作投递到消息队列,下游微服务集群来订阅消费,之后消费的时候对售卖员ID上分布式锁。具体实现是这样吗[保卫萝卜_问号]

小妖怪5号:
看样子佣金总额是做了实时更新,这个场景应该是可以接受一定的延迟的。 如果是更新频率高的过分,先生成佣金明细,然后批处理更新总额也可以

【回复】举例场景,帮助你们理解问题
炒股赚了千万花不完:
其实数据库用乐观锁在最后更新的时候还是会加锁的,只是通过版本号的比对,减少了不必要的锁等待时间,不知道这么理解对不对。所以网上那些八股文说乐观锁不加锁是不是就是瞎扯?

【回复】乐观锁不加锁就是瞎扯[妙啊]都是update语句如果更新同一条记录肯定会产生锁呀,不然mysql不就被你攻破了[妙啊]当然如果没有冲突的情况下,那确实是不加锁[妙啊]
【回复】乐观锁有读有写,读没有锁写看场景
【回复】回复 @经典鸡翅 :说的还是不太准确,update确实会加锁,但是版本号不,where条件已经不成立了直接马上返回,此时并不加锁。最多冲突的第一次加锁,但是update一旦被某个线程执行,其它冲突的线程也就都立马返回了

学习 程序员 大厂 实战 Java Java面试题 社招 大厂面试题 必剪创作 科技猎手计划2022第二季

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!