关于超卖问题
一直不理解 update product_skus set stock = stock - $amount where id = $id and stock >= $amount
这条 sql 为什么要加最后一个 stock >= $amount
的判断。stock
字段是无符号的整型,不会出现更新后值为负数的情况,已经避免了超卖,为什么还要多此一举加后面的判断呢?今儿又想了想好像理解了。
在测试表 product_skus 中,id 为 1 的商品的库存为 1。
执行 update product_skus set stock = stock - 2 where id = 1
这条 sql 会报错,在项目中使用会抛异常进行回滚事务。
执行 update product_skus set stock = stock - 2 where id = 1 and stock >= 2
这条 sql 不会报错,执行结果为影响的行为 0 条,在项目中执行就提示商品库存不足。
所以加后面的判断,只是为了在商品不足的时候给用户提示,而不是直接回滚事务,啥也不做。各位大佬,是这样吗?
推荐文章: