秒杀的过程中【减库存,下订单,写入秒杀订单】需要具有原子性。
所以要保证这三个操作是一个事物。在Java中可以用@Transactional
注释
//保证这三个操作,减库存 下订单 写入秒杀订单是一个事物
@Transactional
public OrderInfo seckill(User user, GoodsVo goods){
//减库存
goodsService.reduceStock(goods);
//下订单 写入秒杀订单
return orderService.createOrder(user, goods);
}
/**
* 因为要同时分别在订单详情表和秒杀订单表都新增一条数据,所以要保证两个操作是一个事物
*/
@Transactional
public OrderInfo createOrder(User 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.getGoodsPrice());
orderInfo.setOrderChannel(1);
orderInfo.setStatus(0);
orderInfo.setUserId(user.getId());
long orderId = orderMapper.insert(orderInfo);
SeckillOrder seckillOrder = new SeckillOrder();
seckillOrder.setGoodsId(goods.getId());
seckillOrder.setOrderId(orderId);
seckillOrder.setUserId(user.getId());
orderMapper.insertSeckillOrder(seckillOrder);
return orderInfo;
}