在开发电商系统的过程中,订单创建是一项非常关键的功能。本文将介绍如何在订单创建过程中,结合Spring Cloud和Seata的XA模式来实现全局事务管理,以确保数据的一致性和完整性。
订单创建过程详解
在这段代码中,我们通过@GlobalTransactional
注解来声明一个全局事务。以下是具体的实现步骤:
@Override
@GlobalTransactional
public Long createOrder(OrderFormDTO orderFormDTO) {
// 1.订单数据
Order order = new Order();
// 1.1.查询商品
List<OrderDetailDTO> detailDTOS = orderFormDTO.getDetails();
// 1.2.获取商品id和数量的Map
Map<Long, Integer> itemNumMap = detailDTOS.stream()
.collect(Collectors.toMap(OrderDetailDTO::getItemId,
OrderDetailDTO::getNum));
Set<Long> itemIds = itemNumMap.keySet();
// 1.3.查询商品
List<ItemDTO> items = itemClient.queryItemByIds(itemIds);
if (items == null || items.size() < itemIds.size()) {
throw new BadRequestException("商品不存在");
}
// 1.4.基于商品价格、购买数量计算商品总价:totalFee
int total = 0;
for (ItemDTO item : items) {
total += item.getPrice() * itemNumMap.get(item.getId());
}
order.setTotalFee(total);
// 1.5.其它属性
order.setPaymentType(orderFormDTO.getPaymentType());
order.setUserId(UserContext.getUser());
order.setStatus(1);
// 1.6.将Order写入数据库order表中
save(order);
// 2.保存订单详情
List<OrderDetail> details = buildDetails(order.getId(), items, itemNumMap);
detailService.saveBatch(details);
// 3.扣减库存
try {
itemClient.deductStock(detailDTOS);
} catch (Exception e) {
throw new RuntimeException("库存不足!");
}
// 4.清理购物车商品
cartClient.deleteCartItemByIds(itemIds);
return order.getId();
}
关键步骤解析
-
订单数据初始化:
- 创建订单对象并设置订单的基础信息。
-
查询商品:
- 从订单表单中获取商品详情,并根据商品ID查询商品信息。
- 如果查询不到所有商品,则抛出异常。
-
计算总价:
- 根据商品的价格和购买数量计算订单的总金额。
-
写入数据库:
- 将订单信息保存到数据库的订单表中。
-
保存订单详情:
- 构建订单详情列表并批量保存到订单详情表中。
-
扣减库存:
- 调用商品服务扣减库存,如果库存不足,则抛出异常。
-
清理购物车:
- 删除购物车中已下单的商品。
XA模式的优势
XA模式是一种分布式事务协议,用于确保多个资源管理器之间的数据一致性。使用Seata的XA模式,可以在分布式系统中实现强一致性的事务处理,尤其适用于需要跨多个数据库或服务的复杂场景。在本例中,使用XA模式可以确保订单创建、库存扣减和购物车清理这些操作在一个全局事务中完成,避免因部分操作失败而导致的数据不一致问题。
通过Spring Cloud与Seata XA模式的结合,我们能够在分布式架构下高效地管理全局事务,提升系统的可靠性和数据一致性,为用户提供更好的购物体验。
标签:事务管理,Seata,商品,items,XA,购物车,订单,电商,order From: https://blog.csdn.net/Takumilove/article/details/140799160