SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截( 三 )

  • ybchen-common:公共模块
  • ybchen-order-service:订单微服务
  • ybchen-product-service:商品微服务
数据库分表为:order(订单微服务库)、product(商品微服务库)、seata(Seata全局事务涉及的表)、nacos(Nacos配置中心,mysql持久化)
SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截

文章插图
Seata依赖<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><exclusions><exclusion><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId></exclusion></exclusions></dependency><dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.4.1</version></dependency><!-- seata 自身序列化bug问题-开始 --><dependency><groupId>com.esotericsoftware</groupId><artifactId>kryo</artifactId><version>4.0.2</version></dependency><dependency><groupId>de.javakaffee</groupId><artifactId>kryo-serializers</artifactId><version>0.42</version></dependency><!-- seata 自身序列化bug问题-结束 -->分布式事务演示关键代码片段
order-service
@AutowiredOrderMapper orderMapper;@AutowiredProductStockControllerFeign productStockControllerFeign;@Override//开启分布式事务 Seta AT模式@GlobalTransactionalpublic ReturnT<String> add() {OrderDO orderDO = new OrderDO();int outTradeNo = new Random().nextInt(1000);orderDO.setOutTradeNo("T" + outTradeNo);orderDO.setCreateTime(new Date());int rows = orderMapper.insert(orderDO);if (rows > 0) {//扣减商品库存ReturnT<String> reduceReturn = productStockControllerFeign.reduce();if (ReturnT.isSuccess(reduceReturn)) {log.info("购买成功");//TODO 模拟异常方式二//int num = 1 / 0;return ReturnT.buildSuccess("购买成功");}// 解决全局拦截器问题 , 通过接口响应状态码,来判断是否主动抛异常?。。。。。。?if (reduceReturn.getCode() != 0) {log.info("扣减商品库存失败,接口响应:{}", reduceReturn);throw new BizException(110, "扣减商品库存失败");}log.info("扣减商品库存失败");return ReturnT.buildError("扣减商品库存失败");}log.info("购买失败");return ReturnT.buildError("购买失败");}product-service
@AutowiredProductStockMapper productStockMapper;@Overridepublic ReturnT<String> reduceProductStock() {ProductStockDO stockDO = new ProductStockDO();stockDO.setProductId(10086);stockDO.setBuyNum(1);stockDO.setCreateTime(new Date());int rows = productStockMapper.insert(stockDO);//TODO 模拟异常方式一//int num = 1 / 0;if (rows > 0) {log.info("扣减商品库存成功,rows=" + rows);return ReturnT.buildSuccess("扣减商品库存成功");} else {log.info("扣减商品库存失败,rows=" + rows);return ReturnT.buildError("扣减失败");}}正常情况场景描述:product微服务和order微服务均正常,2个微服务的事务全部提交成功 , 2个库都插入数据成功
SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截

文章插图
异常情况一(product微服务异常)场景描述:product微服务发生异常,order微服务正常情况 , 出现异常情况时 , 需要2个微服务的事务全部回滚,2个库插入的数据都回滚
SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截

文章插图
异常情况二(order微服务异常)场景描述:order微服务发生异常,product微服务正常,出现异常情况时 , 需要2个微服务的事务全部回滚,2个库插入的数据都回滚
SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截

文章插图
异常情况三(product微服务未启动)场景描述:order微服务正常启动,product微服务未启动,需要把order微服务插入的数据回滚
SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截

文章插图
项目源码https://gitee.com/yenbin_chen/ybchen-seatay

推荐阅读