订单命令模式
调用链路
- 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);
}
命令的扩展
在二次开发中,经常要扩展订单创建时的逻辑,则需实现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()
方法来回滚相应的数据