秒杀的过程中【减库存,下订单,写入秒杀订单】需要具有原子性。
所以要保证这三个操作是一个事物。在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;
}
本文探讨了在秒杀系统中如何确保减库存、下订单和写入秒杀订单操作的原子性,通过使用Java的@Transactional注解实现事务管理,保证了在订单详情表和秒杀订单表中同时进行的操作能够在一个事务内完成。
6215

被折叠的 条评论
为什么被折叠?



