问题描述
0元商品每个用户限购一单,如果有同一个用户用脚本并发请求下单时,会插入多条0元订单。
相关代码
public void initOrder(A a,B b) {
//检查是否下过当前0元商品订单
if (check(a, b)) {
//已下单过一次
// 抛出异常
} else {
//生成订单
addOrder(a);
}
}
分析
上面的逻辑判断是有问题的:第一个请求调用 check() 返回 false,正在执行 addOrder() 操作,还没来得及提交事务,第二个请求调用 check() 返回也是 false,并去执行了 addOrder() 操作,就造成了同一用户多次下单的情况。
可以在生成订单的时候加个锁