库存不足,抛出异常之后,数据仍然被写进数据库
抛出"java.lang.RuntimeException: 订单创建失败,原因:库存不足"之后,订单仍然被写进数据库了,事务没有回滚.排查了很久,没找到怎么回事.
正在回答
我刚在我这里测试了一下,3种情况,serviceA调用ServiceB都可以进行回滚,
除零异常
手动抛出异常
自定义异常
这三种都可以回滚。
只有不加@Transactional的时候,才会不回滚。
/**
* @param orderBO :
* @Description: 创建订单
* @return: null
* @Author: 张建 (119855181@qq.com)
* @date: 2020/5/13
*/
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void create(OrderBO orderBO) {
String userId=orderBO.getUserId();
String itemSpecIds=orderBO.getItemSpecIds();
String addressId=orderBO.getAddressId();
Integer payMethod=orderBO.getPayMethod();
String leftMsg=orderBO.getLeftMsg();
Orders orders= new Orders();
String sid = Sid.nextShort();
orders.setId(sid);
orders.setUserId(userId);
// 包邮费用设置为0
Integer postAmount = 0;
orders.setPostAmount(postAmount);
orders.setPayMethod(payMethod);
orders.setLeftMsg(leftMsg);
orders.setIsComment(YesOrNo.NO.type);
orders.setIsDelete(YesOrNo.NO.type);
orders.setCreatedTime(new Date());
orders.setUpdatedTime(new Date());
//查询地址快照
UserAddress address=userAddressService.queryAddress(userId,addressId);
orders.setReceiverName(address.getReceiver());
orders.setReceiverMobile(address.getMobile());
orders.setReceiverAddress(address.getProvince()+address.getCity()+address.getDistrict()+address.getDetail());
//查询商品规格,计算商品总价格和实际支付价格
String[] splits = itemSpecIds.split(",");
//TODO 整合redis后,从缓存的购物车里获取购买的商品数量,这里先统一设置为1.
int number = 1;
//商品累积金额
int amount = 0;
//商品实付金额
int payAmount=0;
for(String specId:splits)
{
//1.累加商品价格和实际支付金额
//1.1根据商品规格id查询商品规格
ItemsSpec itemsSpec = itemsService.querySpecById(specId);
amount += itemsSpec.getPriceNormal();
payAmount += itemsSpec.getPriceDiscount();
//2.根据商品id获取商品信息和主图
String itemId = itemsSpec.getItemId();
Items item = itemsService.queryItemById(itemId);
String itemsMainImg=itemsService.queryItemMainImgById(itemId);
//3.循环保存子订单到数据库
String subOrderId = Sid.nextShort();
OrderItems subOrderItems = new OrderItems();
subOrderItems.setId(subOrderId);
subOrderItems.setOrderId(sid);
subOrderItems.setItemId(itemId);
subOrderItems.setItemImg(itemsMainImg);
subOrderItems.setItemName(item.getItemName());
subOrderItems.setItemSpecId(specId);
subOrderItems.setItemSpecName(itemsSpec.getName());
subOrderItems.setPrice(itemsSpec.getPriceDiscount());
subOrderItems.setBuyCounts(number);
int i = orderItemsMapper.insert(subOrderItems);
// 2.4 在用户提交订单以后,规格表中需要扣除库存
itemsService.decreaseStock(specId,number);
}
orders.setTotalAmount(amount);
orders.setRealPayAmount(payAmount);
ordersMapper.insert(orders);
//保存订单状态
OrderStatus orderStatus = new OrderStatus();
orderStatus.setOrderId(sid);
orderStatus.setOrderStatus(OrderStatusEnum.WAIT_PAY.type);
orderStatus.setCreatedTime(new Date());
orderStatusMapper.insert(orderStatus);
}
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星