假设是一个购物系统,为了防止库存出现负的,做了个乐观锁,
就是只更新版本比数据库中的version高的,如果相同,就重新读一遍库存做判断票数够不够嘛,
但是这根直接在sql里面写,update xxx-20 where xxx-20>0 有啥区别,
也会保证库存不会出现负的,那乐观锁真正存在的意义是啥呢,
多谢
update xxx-20 where xxx-20 > 0 //这个也有点乐观锁的味道.
update xxx-20 where #{newVersion} > version 如果你更新一个 varchar(比方'地址'时), 上面就没办法了. 当然 , 你可以用原始值去比, 但有可能 地址经过了: a => b => c => a,
就是经过好几步又变回了A, 这时, 你 update 地址=newA where 地址=a 就无法知道数据已被人改过.
乐观锁,指的是假设在程序读取到更新的这段时间,数据不被其他程序修改。所以,一般的sql一般为,比较version是否等于读取时候的值,即where version = {old_version},如果是,则更新,否则抛出异常,让上游重新查询,重试更新。
判断版本号比判断库存为负更严格,他要求你更新的时候,数据库的记录还是你读出来的时候的记录,而判断库存未负只要求你更新的时候,你更新库存的结果大于0,即使你读出来后别人更新过这条记录也没关系
秒杀例子,30万 tps
https://github.com/digoal/blog/blob/master/201711/20171107_31.md
skip locked row例子
https://github.com/digoal/blog/blob/master/201610/20161018_01.md
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。