redis分布式锁不生效

redis分布式锁不生效

redis锁没生效,20个goroutine扣库存,结果不是-20

https://img1.sycdn.imooc.com//climg/63b7c1cc096e454c13760799.jpg

https://img1.sycdn.imooc.com//climg/63b7c19e0944779018650479.jpg

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
bobby 2023-01-09 15:56:15

https://img1.sycdn.imooc.com//climg/63bbc89809bbfed511670716.jpg 这里加上这个

提问者 2925933223 2023-01-06 14:57:14

https://img1.sycdn.imooc.com//climg/63b7c5fb099be9fa13710760.jpg

和go 自带的 sync.Mutex一个写法,把事务包起来时生效了

  • bobby #1

    这是说问题已经解决了?

    2023-01-06 18:59:03
  • 老师给的代码这里确实是有问题的,扣减不是协程安全的。在 for 循环中更新完记录直接就释放了锁,而事务还没有被提交,即记录没有真正更新到 db。此时可能有其他协程进来,由于分布式锁已经被释放了,所以能够获取到锁,此时更新就会出现问题。

    所以我理解这里将 Unlock() 放在 defer 中,在 tx.Commit() 执行完成,方法退出时,将分布式锁释放掉。

    2023-01-06 23:39:09
  • 放在defer中也是不合理的,放在defer中是为了解决在函数执行过程中出现异常的时候可以进行unlock, 因为一旦放在了defer中就意味着你的lock会一直持续到return的时候,无法精确控制unlock的时间,所以即使使用defer也是配合着recover的情况发生而不应该是用于控制unlock,否则无法控制代码段的lock区间

    2023-01-07 19:17:23
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Go开发工程师全新版
  • 参与学习       489    人
  • 解答问题       559    个

风口上的技术,薪资水平遥遥领先,现在学习正值红利期! 未来3-5年,Go语言势必成为企业高性能项目中不可替代的语言 从基础到项目实战再到重构,对转行人员友好,真正从入门到精通!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师