电商系统,用户付款后,需要需要更新商品库存,xxx 代表购买数量 隔离级别:重复读
UPDATE item SET inventory = CASE WHEN inventory >= xxx THEN inventory-xxx ELSE inventory END
![]() | 1 saltxy 2019-04-23 19:27:49 +08:00 会 |
![]() | 2 dapang1221 2019-04-23 19:31:04 +08:00 付款这个过程之前就应该锁上库存,可是总不能一直锁了,所以最后检查下库存状态,超卖了就退款吧 |
![]() | 3 mmdsun 2019-04-23 19:32:13 +08:00 via Android where id=XXX and 库存数量>=扣减商品 |
4 xztwana 2019-04-23 19:33:42 +08:00 via iPhone redis 不就好了 |
5 jzmws 2019-04-24 09:21:24 +08:00 我之前做过的是,把库存放到 redis 中 更新库存的时候同时跟新数据库和缓存 还有从数据库的层面上控制的,把库存数量变成 unsigned int 无符号的整型,这样在数据库层面做最后的保证 . 我觉得程序要控制,数据库上也加一个.双保险 |
6 joesonw 2019-04-24 09:57:18 +08:00 也不用全部放 redis 那样麻烦. 用 redis SETNX 当作锁来用. |
7 OP @jzmws unsigned int 用这种类型很保险,绝对不会出现复数。 |