赞
踩
上面结构是比较典型的远程调用结构,如果account操作数据库失败需要让order模块和storage模块撤销(回滚)操作,声明式事务无法完成这个操作,需要使用Seata来解决。
<!-- Seata和SpringBoot整合依赖 -->
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</dependency>
<!-- Seata 完成分布式事务的两个相关依赖(Seata会自动使用其中的资源) -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
seata:
# 定义事务的分组,一般是以项目为单位的,不同项目用它来区分
tx-service-group: csmall_group
service:
vgroup-mapping:
# 设置csmall_group分组使用默认(default)的seata配置
csmall_group: default
grouplist:
# 设置seata的ip和端口号位置
default: localhost:8091
@Override public void orderAdd(OrderAddDTO orderAddDTO) { // 1.先去减少订单中商品的库存数量(调用stock模块减少库存的方法) // 库存模块减少库存需要StockReduceCountDTO对象,才能运行,所以先实例化它 StockReduceCountDTO countDTO=new StockReduceCountDTO(); countDTO.setCommodityCode(orderAddDTO.getCommodityCode()); countDTO.setReduceCount(orderAddDTO.getCount()); // 利用dubbo调用stock模块的业务逻辑层方法实现库存的减少 stockService.reduceCommodityCount(countDTO); // 2.从购物车中删除用户勾选的商品(调用cart模块删除购物车商品的方法) // 利用dubbo调用cart模块的业务逻辑层方法实现购物车中商品的删除 cartService.deleteUserCart(orderAddDTO.getUserId(), orderAddDTO.getCommodityCode()); // ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ if(Math.random()<0.5){ // 随机发生业务异常 throw new CoolSharkServiceException( ResponseCode.INTERNAL_SERVER_ERROR,"发生随机异常!"); } // 3.新增订单信息 Order order=new Order(); BeanUtils.copyProperties(orderAddDTO,order); // 执行新增 orderMapper.insertOrder(order); log.info("新增订单信息为:{}",order); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。