开发者社区> 问答> 正文

一个关于乐观锁的问题

已解决

假设是一个购物系统,为了防止库存出现负的,做了个乐观锁,
就是只更新版本比数据库中的version高的,如果相同,就重新读一遍库存做判断票数够不够嘛,
但是这根直接在sql里面写,update xxx-20 where xxx-20>0 有啥区别,
也会保证库存不会出现负的,那乐观锁真正存在的意义是啥呢,
多谢

展开
收起
waasdasd 2017-10-19 18:01:35 3465 0
5 条回答
写回答
取消 提交回答
  • 采纳回答

    update xxx-20 where xxx-20 > 0 //这个也有点乐观锁的味道.
    update xxx-20 where #{newVersion} > version 如果你更新一个 varchar(比方'地址'时), 上面就没办法了. 当然 , 你可以用原始值去比, 但有可能 地址经过了: a => b => c => a,

    就是经过好几步又变回了A, 这时, 你 update 地址=newA where 地址=a 就无法知道数据已被人改过.

    2019-07-17 21:40:10
    赞同 1 展开评论 打赏
  • 乐观锁,指的是假设在程序读取到更新的这段时间,数据不被其他程序修改。所以,一般的sql一般为,比较version是否等于读取时候的值,即where version = {old_version},如果是,则更新,否则抛出异常,让上游重新查询,重试更新。

    2019-07-17 21:40:10
    赞同 展开评论 打赏
  • 判断版本号比判断库存为负更严格,他要求你更新的时候,数据库的记录还是你读出来的时候的记录,而判断库存未负只要求你更新的时候,你更新库存的结果大于0,即使你读出来后别人更新过这条记录也没关系

    2019-07-17 21:40:10
    赞同 展开评论 打赏
  • update xxx-20 where xxx-20>0 本身就是乐观锁,不必再读version判断了,判断也没用

    2019-07-17 21:40:10
    赞同 展开评论 打赏
  • 公益是一辈子的事, I am digoal, just do it. 阿里云数据库团队, 擅长PolarDB, PostgreSQL, DuckDB, ADB等, 长期致力于推动开源数据库技术、生态在中国的发展与开源产业人才培养. 曾荣获阿里巴巴麒麟布道师称号、2018届OSCAR开源尖峰人物.
    2019-07-17 21:40:10
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载