• Seata之@GlobalTransactional验证


    下订单 -> 减库存 -> 扣余额 -> 改(订单)状态

    1.数据库初始情况:

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    2.正常下单

    http://localhost:2001/order/create?userId=1&productId=1&count=10&money=100

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    3.超时异常,没加@GlobalTransactional

    模拟AccountServiceImpl添加超时

    import com.tianxia.alibaba.dao.AccountDao;
    import com.tianxia.alibaba.service.AccountService;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Service;
    import javax.annotation.Resource;
    import java.math.BigDecimal;
    import java.util.concurrent.TimeUnit;
    
    /**
     * @author liqb
     * @date 2023-05-27 21:16
     */
    @Service
    public class AccountServiceImpl implements AccountService {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(AccountServiceImpl.class);
        
        @Resource
        AccountDao accountDao;
    
        /**
         * 扣减账户余额
         * @author liqb
         * @date 2023-05-27 21:20
         */
        @Override
        public void decrease(Long userId, BigDecimal money) {
            LOGGER.info("------->account-service中扣减账户余额开始");
            //模拟超时异常,全局事务回滚
            //暂停几秒钟线程
            try { 
                TimeUnit.SECONDS.sleep(20); 
            } catch (InterruptedException e) { 
                e.printStackTrace(); 
            }
            accountDao.decrease(userId,money);
            LOGGER.info("------->account-service中扣减账户余额结束");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    另外,OpenFeign的调用默认时间是1s以内,所以最后会抛异常。

    数据库情况

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    故障情况

    • 当库存和账户金额扣减后,订单状态并没有设置为已经完成,没有从零改为1
    • 而且由于feign的重试机制,账户余额还有可能被多次扣减

    4.超时异常,加了@GlobalTransactional

    用**@GlobalTransactional标注OrderServiceImpl的create()方法**。

    /**
     * 创建订单->调用库存服务扣减库存->调用账户服务扣减账户余额->修改订单状态
     * 简单说:下订单->扣库存->减余额->改状态
     */
    @Override
    @GlobalTransactional(name = "fsp-create-order", rollbackFor = Exception.class)
    public void create(Order order) {
        log.info("----->开始新建订单");
        //1 新建订单
        orderDao.create(order);
    
        //2 扣减库存
        log.info("----->订单微服务开始调用库存,做扣减Count");
        storageService.decrease(order.getProductId(),order.getCount());
        log.info("----->订单微服务开始调用库存,做扣减end");
    
        //3 扣减账户
        log.info("----->订单微服务开始调用账户,做扣减Money");
        accountService.decrease(order.getUserId(),order.getMoney());
        log.info("----->订单微服务开始调用账户,做扣减end");
    
        //4 修改订单状态,从零到1,1代表已经完成
        log.info("----->修改订单状态开始");
        orderDao.update(order.getUserId(),0);
        log.info("----->修改订单状态结束");
    
        log.info("----->下订单结束了,O(∩_∩)O哈哈~");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    还是模拟AccountServiceImpl添加超时,下单后数据库数据并没有任何改变,记录都添加不进来,达到出异常,数据库回滚的效果

  • 相关阅读:
    《LeetCode力扣练习》代码随想录——二叉树(合并二叉树---Java)
    全局变量和静态变量的初始化
    CMake Cookbook笔记(11/19未完待续)
    C# 程序开机自动启动
    STM32控制机械臂与传感器:整合ESP32通讯、Spark与人工智能优化的智能制造解决方案(代码说明)
    Java学习笔记2024/2/23
    微服务框架 SpringCloud微服务架构 9 初识 Docker 9.1 什么是Docker
    python的装饰器
    python入门函数讲解(简单明了,一分钟掌握一个)
    托管与非托管数据转换方法之C#设计笔记(十三)
  • 原文地址:https://blog.csdn.net/weixin_44230693/article/details/130906715