V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  chwangtenger  ›  全部回复第 1 页 / 共 1 页
回复总数  10
求求了
cm9yeWppYW5namlhbmc=
@liukaka68 还有吗
CAS 是一条 CPU 并发原语
2020-08-02 22:54:59 +08:00
回复了 lxy199795swu 创建的主题 问与答 有做过黑马畅购商城的老哥吗?有偿帮忙解决问题
请问这个畅购商城,和另外的乐优商城什么的哪个比较好呢?我都是百度搜索搜到的。。。进去他们官网连个课程介绍都没搜到啊,好奇怪,你们都是哪里看的?
不好意思啊各位,后面一章里面说到之前讲错了,后来改成了判断一下影响的行数。
@limuyan44 这已经是最终的代码了。。。
@l669306630 我网上看到了类似的回答,他们是 apt-get 装的,我是自己下载解压的,我试了一下用 apt-get 装,你的这个方法就可以了。可能是之前那种解压的版本不会去读这个配置文件?
@l669306630 你好,我也遇到了你这个问题,但是我按照你说的改了之后
> netstat -ano | findstr 5672
还是和原来一样,不会出现 127.0.0.1 的那行
@limuyan44 代码有好几层,那我贴一下


MiaoshaController.java

@RequestMapping(value="/do_miaosha", method= RequestMethod.POST)
@ResponseBody
public Result<OrderInfo> miaosha(Model model,MiaoshaUser user,
@RequestParam("goodsId")long goodsId) {
model.addAttribute("user", user);
if(user == null) {
return Result.error(CodeMsg.SESSION_ERROR);
}
//判断库存
GoodsVo goods = goodsService.getGoodsVoByGoodsId(goodsId);//10 个商品,req1 req2
int stock = goods.getStockCount();
if(stock <= 0) {
return Result.error(CodeMsg.MIAO_SHA_OVER);
}
//判断是否已经秒杀到了
MiaoshaOrder order = orderService.getMiaoshaOrderByUserIdGoodsId(user.getId(), goodsId);
if(order != null) {
return Result.error(CodeMsg.REPEATE_MIAOSHA);
}
//减库存 下订单 写入秒杀订单
OrderInfo orderInfo = miaoshaService.miaosha(user, goods); //我提问的操作在这个函数里面
return Result.success(orderInfo);
}

MiaoshaService.java 中,上文的 miaoshaService.miaosha

@Transactional
public OrderInfo miaosha(MiaoshaUser user, GoodsVo goods) {
//减库存 下订单 写入秒杀订单
goodsService.reduceStock(goods);
//order_info maiosha_order
return orderService.createOrder(user, goods);
}


GoodsService.java 中,上文的 goodsService.reduceStock

public void reduceStock(GoodsVo goods) {
MiaoshaGoods g = new MiaoshaGoods();
g.setGoodsId(goods.getId());
goodsDao.reduceStock(g);
}


GoodsDao.java 中,上文的 goodsDao.reduceStock
@Update("update miaosha_goods set stock_count = stock_count - 1 where goods_id = #{goodsId} and stock_count > 0")
public int reduceStock(MiaoshaGoods g);


OrderService 上上上段代码最后一句,中的 orderService.createOrder

@Transactional
public OrderInfo createOrder(MiaoshaUser user, GoodsVo goods) {
OrderInfo orderInfo = new OrderInfo();
orderInfo.setCreateDate(new Date());
orderInfo.setDeliveryAddrId(0L);
orderInfo.setGoodsCount(1);
orderInfo.setGoodsId(goods.getId());
orderInfo.setGoodsName(goods.getGoodsName());
orderInfo.setGoodsPrice(goods.getMiaoshaPrice());
orderInfo.setOrderChannel(1);
orderInfo.setStatus(0);
orderInfo.setUserId(user.getId());
long orderId = orderDao.insert(orderInfo);

System.out.println();
MiaoshaOrder miaoshaOrder = new MiaoshaOrder();
miaoshaOrder.setGoodsId(goods.getId());
miaoshaOrder.setOrderId(orderId);
miaoshaOrder.setUserId(user.getId());
orderDao.insertMiaoshaOrder(miaoshaOrder);

redisService.set(OrderKey.getMiaoshaOrderByUidGid, ""+user.getId()+"_"+goods.getId(), miaoshaOrder);

return orderInfo;
}



我觉得这两句话虽然在一个事务里,但是第一句里用了 where,虽然库存已经没了,但是没有报异常,导致 return 那句的订单还是可以生成。
//减库存 下订单 写入秒杀订单
goodsService.reduceStock(goods);
//order_info maiosha_order
return orderService.createOrder(user, goods);
@limuyan44 对,sql 没问题的,但是影响的行是 0 行,也不会报出异常,所以后面的程序代码里顶多只能自己判断返回的影响行数来判断刚才的减库存有没有成功,但是他代码里也没这么写,我感觉老师不是讲错了。但是我又无法解释为啥他并发的结果是对的,一件都没超。
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2971 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 20ms · UTC 12:48 · PVG 20:48 · LAX 04:48 · JFK 07:48
Developed with CodeLauncher
♥ Do have faith in what you're doing.