V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
afterglow
V2EX  ›  程序员

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

  •  1
     
  •   afterglow · 2019-04-23 18:34:40 +08:00 · 2845 次点击
    这是一个创建于 2050 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    还有从数据库的层面上控制的,把库存数量变成 unsigned int 无符号的整型,这样在数据库层面做最后的保证 .
    我觉得程序要控制,数据库上也加一个.双保险
    joesonw
        6
    joesonw  
       2019-04-24 09:57:18 +08:00
    也不用全部放 redis 那样麻烦. 用 redis SETNX 当作锁来用.
    afterglow
        7
    afterglow  
    OP
       2019-04-24 09:58:06 +08:00
    @jzmws unsigned int 用这种类型很保险,绝对不会出现复数。
    jzmws
        8
    jzmws  
       2019-04-24 23:43:08 +08:00
    @afterglow 对这个是最后的保险 !
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3226 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 12:57 · PVG 20:57 · LAX 04:57 · JFK 07:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.