跳到主要内容

订单命令模式

调用链路

img

  • javashop订单的创建采用命令这模式,以保证事务的一致性
  • 订单/交易的创建由TradeCreator接口统一创建
  • 在创建前首先开启事务,进而循环调用各个订单创建命令
  • 命令调用的顺序由命令的sequence()方法决定
  • 命令调用过程中出现任意异常,则中断命令的执行,进行事务回滚
  • 如果所有命令均正常执行完成则正常提交事务

库存扣减命令

javashop的库存扣减为了保证高性能的同时保证不超卖采用了redis+lua脚本的方式,所以他的他的事务不在spring事务管理范围,当发生异常时,需要显示的处理rollback()方法

    @Override
public void rollback() {
//获取订单中的商品sku信息集合
List<OrderSkuVO> skuList = order.getOrderSkuList();
//根据订单中的商品sku信息集合构建要扣减的库存列表
List<GoodsQuantityVO> goodsQuantityList = buildQuantityList(skuList);
//循环转换库存扣减数量
for (GoodsQuantityVO goodsQuantityVO : goodsQuantityList) {
goodsQuantityVO.setQuantity(0 - goodsQuantityVO.getQuantity());
}

//恢复缓存中扣减的库存信息
this.goodsQuantityClient.updateSkuQuantity(goodsQuantityList);

}

命令的扩展

image-20231212141110889

在二次开发中,经常要扩展订单创建时的逻辑,则需实现OrderCreateCommand接口即可,举例:

public class YourCommand implements OrderCreateCommand {

/**
* 订单创建命令执行方法
*
* @return
*/
@Override
public CommandResult execute() {
//你的逻辑
return new CommandResult(false,"模拟的订单创建异常");
}

/**
* 交易创建命令执行失败回滚方法
*/
@Override
public void rollback() {

}

/**
* 定义执行顺序
*
* @return
*/
@Override
public int sequence() {
return 1000;
}
}

  • 其中 sequence() 方法决定了命令的执行顺序
  • 如果逻辑中有spring事务无法涵盖的事务逻辑,请实现rollback()方法来回滚相应的数据