电商网站,如何设计防止超卖?
同时又不能影响性能!
或者说将超卖的概率降到最低
貌似淘宝也有超卖的现象,当然是在双十一
这类大并发的情况中。
把库存量字段类型设置成unsigned
, 在下订单到时候会去修改库存量。
UPDATE products SET left_num =CONVERT( left_num - 8 AS SIGNED ) WHERE id = 1;
在并发到时候如果库存量被减到负数会抛 error.貌似 Mysql 要 strict SQL mode is enabled.
库存量的设计,甚至是库存的设计,甚至是库存如何减的问题? 是设计一个字段,然后所有下单商品然后来减这个字段的值? 还是分库,北京库,上海库,北京不够货再来差其他地方的库存?
库存不要减
例如:product.available_quantities 是 10 吧,然后下了 5 个订单,但是没有发货,结果你这边又有补货了,手头有 15 个产品了,怎么办?available_quantities 肯定不能写 15, 要写 available_quantities - 5 个订单的数量,这样子的话维护起来很容易出错,加上取消订单的同时在补货这种情况更会出错
可以维护双个字段,一个是现有库存,一个是已卖产品数量,在发货的同时,将已卖产品数量 -1, 现有库存 -1
@hooopo 这个理论上应该是可以的,我可以试试 @small_fish__ 我们现在的设计就是这样的,这样在并发下会有超卖的情况出现,应该可以在数据库设置一个校验,销量大于总量就 Rollback
#5 楼 @hooopo 尽量用标准做法啊,你用 unsigned,0 就变成了特殊情况了啊。减成负的时候跑错是在 UPDATE 语句里做的,这样后期维护起来你得万分小心啊。在 constraint 里做,就一次搞定了啊。
CHECK ( available >= 0)
http://www.postgresql.org/docs/current/static/ddl-constraints.html
The CHECK clause is parsed but ignored by all storage engines