sql 库存问题

以下就库存问题,个人的几种解决方案,从并发考虑性能最优到最差

方案1:update 时 where 库存字段 >=0,假设数据表数据为 id=1, num=5(即,当前只剩下5个库存)

update 库存表 set num=num-5 where num-5 >= 0 and id=1; // 减5库存,影响行数1
update 库存表 set num=num-6 where num-6 >= 0 and id=1; // 减6库存,影响行数0

方案2:乐观锁,在数据库在 version 字段

1)select id,version,num from 库存表 where id=1 // 假设取出 version=1
2)判断剩余库存 num 和要减的数量大小
3)update num=num-减的数量,version=version+1 from 库存表 where version=1

方案2:悲观锁 for update

强一致性方案,性能较低。特别注意,在事务内使用务必 commit or rollback。事务不提交,for update 悲观锁不会被释放。
(由for update引发的血案 https://juejin.im/post/5cde18396fb9a037e92f07ab)。

发表新评论