并发库存问题

并发库存控制

例如库存只剩余一个 同时进入两个请求 数据可能出现负值的情况

解决方案

字段标记unsigned

在数据库中将字段定义为unsigned (其中阿里巴巴开发规约中提到了这一点:数据库中非负的字段使用该关键字 阿里巴巴规约

1
repository INT(11) unsigned DEFAULT '0'COMMENT '库存'

程序中 如果数据已经为0 程序依然请求减一的操作 数据会出现DataIntegrityViolationException 异常

1
2
3
4
5
6
7
try {
//执行数据库库存-1的操作
......
} catch (DataIntegrityViolationException e) { //并发导致的库存问题
//异常处理
......
}

通过这种方式可以保证数据的正确性

更新判断
1
update product set num=num-1 where num > 0;

采用这种方式 只有当库存>0的时候才能够进行更新

比较与第一种 更加轻便 使用库做最后一层拦截

redis等缓存

可以使用redis等缓存技术 实现对库存的控制 同时高效的处理并发的问题 例如秒杀等活动 防止商品超卖

未经作者允许 请勿转载,谢谢 :)

lemon wechat
欢迎大家关注我的订阅号 SeeMoonUp
写的不错?鼓励一下?不差钱?