遇到的问题
1.目前扣库存是MySQL,行锁来保证库存不超买
2.扣库存方法执行流程 1:开启实物 2:记录消费唯一明细(保证业务幂等),3:扣除库存 4:提交事务
3.现象:同一个商品并发高时出现扣库存事务执行缓慢
关键算法(方案)
方案1
1.将库存数据缓存到Redis, 查询,批量查询是使用,减轻数据库的压力
2.扣库存以RDS数据库为扣库存解决方案为主(要RDS开启 rds_ic_reduce_hint_enable 参数)
以下是原生MySQL行锁扣库存和RDS数据库扣库存解决方案压力测试数据对比
| RDS(AliSQL) | 20 | 1167.31 | 16.51 | 361865 | 0 | 0.00% | |
| MySQL | 扣库存 | 20 | 156.38 | 129.75 | 20329 | 0 | 0.00% |
|
数据库
|
事务名
|
并发用户
|
TPS
|
RT(ms)
|
执行事务数
|
失败事务数
|
失败率
|
|---|
update COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL QUEUE_ON_PK 100 TARGET_AFFECT_ROW 1 t1 set c=c-1 where id=100 and c>=1;
注:
1. COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL 原有的开启事务异常回滚事务不支持。
2. update时原生SQL 会返回影响的行数如返回修改0行, 改为QUEUE_ON_PK 100 TARGET_AFFECT_ROW 1 修改时where条件不满足时返回异常 UncategorizedSQLException : The affected row number does not match that of user specified

被折叠的 条评论
为什么被折叠?



