一般库存的操作主要涉及到两个点,一个是并发下库存的扣减,保证业务上不会发生超卖导致库存负数问题(某些业务场景下是允许超卖的),另外一个是,新增库存,也就是说更新库存数量的时候,如何保证在多人操作的场景下不会出现数据的相互覆盖。

第一个问题: 为了防止库存超卖,那么只要在sql层面控制即可,通过更新行数据的原子性,来保证库存数量不会被抵扣成负数。类似以下sql,只要在每次抵扣库存的时候通过where判断以下 (account_balance - #{num}) >=0 是否大于等于0,就不会出现超卖的场景。

eg:

update account_info set account_balance = account_balance - #{num} where id = #{id} and (account_balance - #{num}) >=0

第二个问题:库存的变动除了来自买家的下单,还来自于卖家的后台管理,比如说采购或者是库存盘点,可能都会导致库存的变动。一般情况下库存上层的不同业务模块可能不是由同一个人管理的,因此可能出现在同个时间段多个人进行修改库存的场景,导致数据的相互覆盖问题。针对这个问题,可以采用CAS的一个思想,即:在表增加一个版本号字段,每次行数据更新成功,那么我的版本号就递增,而每次去操作更新的时候,都会拿着当前的版本号和表里面的版本号做对比,如果版本号一样,说明行数据没有修改,如果不一样,那么就是有其他人更新过数据,此时便不会更新成功,可以给与前端弹窗提醒:数据已被更新,请刷新。 eg:

update account_info set account_balance = #{num} where id = #{id} and version = #{version}