0元商品每个用户限购一单

问题描述

0元商品每个用户限购一单,如果有同一个用户用脚本并发请求下单时,会插入多条0元订单。

相关代码

public void initOrder(A a,B b) {
    //检查是否下过当前0元商品订单
    if (check(a, b)) {
       //已下单过一次
       // 抛出异常
    } else {
       //生成订单
       addOrder(a);
    }
}

分析

上面的逻辑判断是有问题的:第一个请求调用 check() 返回 false,正在执行 addOrder() 操作,还没来得及提交事务,第二个请求调用 check() 返回也是 false,并去执行了 addOrder() 操作,就造成了同一用户多次下单的情况。

请教大佬们,如何处理这种多并发问题?
阅读 2.2k
2 个回答

可以在生成订单的时候加个锁

或许可以维护一个单例的List<用户Id>
每次执行initOrder()方法时检查list中是否包含用户Id,不包含则.add()并执行addOrder(),否则返回已下过单
为了防止因为服务器重启引发的list内容丢失,可以在启动的时候向list初始化已下过单的用户
这样你就不必通过ORM来check()了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进