用以下 SQL 去更新商品库存会不会超卖?

2019-04-23 18:34:40 +08:00
 afterglow

电商系统,用户付款后,需要需要更新商品库存,xxx 代表购买数量 隔离级别:重复读

UPDATE item SET inventory = CASE WHEN 
inventory >= xxx THEN inventory-xxx ELSE inventory END
2676 次点击
所在节点    程序员
8 条回复
saltxy
2019-04-23 19:27:49 +08:00
dapang1221
2019-04-23 19:31:04 +08:00
付款这个过程之前就应该锁上库存,可是总不能一直锁了,所以最后检查下库存状态,超卖了就退款吧
mmdsun
2019-04-23 19:32:13 +08:00
where id=XXX and 库存数量>=扣减商品
xztwana
2019-04-23 19:33:42 +08:00
redis 不就好了
jzmws
2019-04-24 09:21:24 +08:00
我之前做过的是,把库存放到 redis 中 更新库存的时候同时跟新数据库和缓存

还有从数据库的层面上控制的,把库存数量变成 unsigned int 无符号的整型,这样在数据库层面做最后的保证 .
我觉得程序要控制,数据库上也加一个.双保险
joesonw
2019-04-24 09:57:18 +08:00
也不用全部放 redis 那样麻烦. 用 redis SETNX 当作锁来用.
afterglow
2019-04-24 09:58:06 +08:00
@jzmws unsigned int 用这种类型很保险,绝对不会出现复数。
jzmws
2019-04-24 23:43:08 +08:00
@afterglow 对这个是最后的保险 !

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/558020

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX