王尘宇王尘宇

研究百度干SEO做推广变成一个被互联网搞的人

SpringCloud+Seata1.4+Nacos1.4+MySQL8实现分布式事务(客户端)

一个seata服务端,三个seata客户端

7. 模拟分布式事务

  • 订单服务先不开启全局事务,注释掉@GlobalTransactional
    /**
     * 创建订单->调用库存服务扣减库存->调用账户服务扣减账户余额->修改订单状态
     * 简单说:下订单->扣库存->减余额->改状态
     */
    @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哈哈~");

    }
  • 账户服务模拟超时异常
    /**
     * 扣减账户余额
     */
    @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中扣减账户余额结束");
    }
  • Postman测试
    由于账户服务超时,postman连接异常

    url参数的意思是1号用户购买了10个1号类型的产品,花了100元

order表

id user_id product_id count money status
1 1 1 10 100 0

account表 (由于feign的重试机制,可能第一次查看和第二次查看的结果会有所不同)

id user_id total used residue
1 1 1000 100 900

storage表

id product_id total used residue
1 1 100 10 90

8. Navicat手动还原数据,验证分布式事务

  • 订单服务开启全局事务注解@GlobalTransactional
    /**
     * 创建订单->调用库存服务扣减库存->调用账户服务扣减账户余额->修改订单状态
     * 简单说:下订单->扣库存->减余额->改状态
     */
    @Override
    @GlobalTransactional(name = "fsp-create-order",rollbackFor = Exception.class)
    public void create(Order order)
  • Postman测试
    还是由于账户服务超时,postman连接异常

    开启全局事务注解时postman调试

order表

id user_id product_id count money status
(N/A) (N/A) (N/A) (N/A) (N/A) (N/A)

account表

id user_id total used residue
1 1 1000 0 1000

storage表

id product_id total used residue
1 1 100 0 100

相关文章

评论列表

发表评论:
验证码

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。