Rails 电商网站,如何设计防止超卖?

tumayun · 2012年12月11日 · 最后由 tumayun 回复于 2013年03月08日 · 7185 次阅读

电商网站,如何设计防止超卖? 同时又不能影响性能! 或者说将超卖的概率降到最低 貌似淘宝也有超卖的现象,当然是在双十一这类大并发的情况中。

大家都不感兴趣!!!

字段类型设置成unsigned

@hooopo 能详细一点吗?

@hooopo 是说销量吗? 这样能解决超卖?

把库存量字段类型设置成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

#10 楼 @tumayun 难不成你这个逻辑还不是在数据库里检查的...

#11 楼 @bhuztez 这个不错 mysql 里貌似没有啊 好像需要用 tigger

#13 楼 @hooopo 好吧,MySQL 太强大了

The CHECK clause is parsed but ignored by all storage engines

http://dev.mysql.com/doc/refman/5.1/en/create-table.html

for update

需要 登录 后方可回复, 如果你还没有账号请 注册新账号