通过分拆库存记录提升并发性
在许多互联网业务中扣除库存操作往往是瓶颈点,例如电商的秒杀活动,派发优惠券等等.因为数据库单挑记录只能串行操作,所有的并发访问需要加排他锁进行访问.
在不向系统中引入其他组件的情况下可以通过将库存记录拆分为多条来提升并发性.基本方案如下.
数据库中为每个批次建立多条记录,拆分库存以降低竞争.
应用服务器在第一个访问发起时,初始化批次库存记录数组.
0 1 2 3 4… 库存记录1_ID 库存记录2_ID 库存记录3_ID 库存记录4_ID 库存记录5_ID… 对每一个派发请求使用轮询算法从上面的数组中取出库存记录 id(需要加读锁), 扣该记录的库存数量.
如果扣减失败,则尝试获取写锁,获取成功后重新尝试从3的操作,如果还是失败,将扣减失败的元素删除.
需要根据数组中剩余的元素数量,控制并发扣减操作数量.假设单条记录可以承担的并发更新量是100,并发令牌数量是100*剩余记录数.