解释代码@Transactional public OrderInfo add(OrderInfo orderInfo) { // 1、生成最基本的订单信息,用户信息,放到orderInfo里 Long userId = orderInfo.getUserid(); //订单id:用户id+当前年月日时分+4位流水号 String orderId = userId + DateUtil.format(new Date(),"yyyyMMddHHmm") + RandomUtil.randomNumbers(4); orderInfo.setOrderid(orderId); //用户相关 UserInfo userInfo = userInfoService.findById(userId); orderInfo.setLinkaddress(userInfo.getAddress()); orderInfo.setLinkman(userInfo.getNickname()); orderInfo.setLinkphone(userInfo.getPhone()); // 2、保存订单表 orderInfo.setCreatetime(DateUtil.formatDateTime(new Date())); orderInfoMapper.insertSelective(orderInfo); List<OrderInfo> orderInfoList = orderInfoMapper.findByOrderId(orderId); // 3、查询订单里面的书籍列表,遍历 List<GoodsInfo> goodsList = orderInfo.getGoodsList(); for(GoodsInfo orderGoodsVO : goodsList){ Long goodsId = orderGoodsVO.getId(); //书籍信息 GoodsInfo goodsDetail = goodsInfoService.findById(goodsId); if(goodsDetail == null){ continue; } Integer orderCount = orderGoodsVO.getCount() == null?0:orderGoodsVO.getCount(); //想买多少 Integer goodsCount = goodsDetail.getCount() == null?0:goodsDetail.getCount(); //有多少库存 //4、扣库存 if(orderCount>goodsCount){ throw new CustomException(ResultCode.ORDER_PAY_ERROR); } goodsDetail.setCount(goodsCount - orderCount); //5、增加销量 int sales = goodsDetail.getSales()==null?0:goodsDetail.getSales(); goodsDetail.setSales(sales+orderCount); goodsInfoService.update(goodsDetail); //6、书籍订单关联表,增加关系 OrderGoodsRel orderGoodsRel = new OrderGoodsRel(); orderGoodsRel.setOrderid(orderInfoList.get(0).getId()); orderGoodsRel.setGoodsid(goodsId); orderGoodsRel.setCount(orderCount); orderGoodsRelMapper.insertSelective(orderGoodsRel); } //7、清空购物车 cartInfoService.empty(userId); return orderInfo; }
时间: 2023-06-18 13:03:28 浏览: 120
这段代码是一个添加订单的方法,使用了事务(@Transactional)来保证操作的原子性。
第一步是生成订单号(orderId),其中包含了用户id、当前时间、以及4位流水号。然后将用户信息(地址、联系人、电话)放入订单信息中。
第二步是保存订单表,将订单信息插入到数据库中。然后查询订单信息,获取订单id。
第三步是遍历订单中的书籍列表,扣减库存、增加销量,并将书籍订单关系表中增加书籍和订单的关联关系。
最后一步是清空购物车,返回订单信息。
如果在扣减库存时订单数量大于库存数量,会抛出一个自定义异常(CustomException),并回滚事务。
相关问题
上述代码@Transactional变到insertOrUpdate方法上有没有影响
将`@Transactional`注解应用在`insertOrUpdate`方法上,不会对代码的功能产生直接影响,但会为该方法添加事务管理。
事务是用于确保一系列数据库操作的一致性和完整性的机制。当一个方法被标记为`@Transactional`时,Spring会在该方法的执行过程中开启一个事务,并在方法执行结束后根据操作的结果决定是否提交或回滚事务。
在`insertOrUpdate`方法中使用`@Transactional`注解可以确保批量插入和批量更新操作在一个事务中进行,这意味着如果在插入或更新过程中出现异常,事务将会回滚,数据库将恢复到操作前的状态。
因此,如果你希望确保批量插入和批量更新操作的一致性,可以将`@Transactional`注解应用在`insertOrUpdate`方法上。这样,无论是插入还是更新操作中的任何一个出现问题,都能够保证数据库的数据一致性。
解释代码 @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
这段代码是使用 Spring 框架中的 @Transactional 注解来标记一个方法,其中 propagation 属性指定了事务的传播行为为 REQUIRES_NEW,表示该方法需要开启一个新的事务;rollbackFor 属性指定了当出现 Exception 异常时需要回滚事务。