关于订单库存扣减的最佳实践
一: 背景
在电商的业务场景中每个商品都是有库存的,而且可能存在很多限售的运营策略。我们团队面临社区电商的业务场景更为复杂。不仅仅是库存限售,存在区域,门店,用户,运营分组,物流等的限售策略。如何面对日单量千万级别(未来更多),和多个维度的限售策略而不超卖,少卖是一个必须解决的问题。
下面就是库存扣减的流程图。冲图种我们可以看出,要保证整个扣减库存不出问题,限购查询和库存的扣减必须是原子性的而且要单线程执行。
现在处理这种场景存在多种方案。但是要保证高性能和高可用,大部分方案并不满足。
二:探索
1. 历史数据库的事务特性和唯一主键的实现原子操作和单线程操作
基于数据库的事务,扣减库存的操作方法同一个事务中进行库存扣减,事务中任何操作失败,执行回滚操作。从而保证原子性。单纯靠数据库的事务,只能在单体的项目中。如何要分布式的项目中,就无法保证单线程操作了。
那如何在多进程中实现单线程扣减库存呢?我们可以利用数据库的唯一索引。具体操作步骤:
- 新建立一张表:t_lock_tbl,同时将商品ID作为唯一索引。
- 进行扣减库存之前在表中插入商品ID,然后进行数据库更新。
- 更新结束后上次刚才插入数据库中的记录,释放锁。
A线程进程扣减库存时候,插入了该商