Seata之@GlobalTransactional验证

news/2024/10/21 9:49:56/

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

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);@ResourceAccountDao accountDao;/*** 扣减账户余额* @author liqb* @date 2023-05-27 21:20*/@Overridepublic 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中扣减账户余额结束");}
}

另外,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哈哈~");
}

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


http://www.ppmy.cn/news/96068.html

相关文章

当下的程序员该如何面对复杂的就业坏境

已经2023年了,我们都知道现在开发趋向于年轻化,大部分都是90后、95后,毕竟,软件开发不像硬件开发一样,年限越高,相对来说越吃香。 31岁,前端工程师,工作经历8年,7年左右都在外包公司…

什么是C语言?

C语言是一种高级编程语言,于1972年由Dennis Ritchie在贝尔实验室开发出来。它是一种通用的、结构化的编程语言,被广泛用于系统软件、嵌入式系统、游戏开发以及科学计算等领域。 C语言的设计目标是提供一种简洁、高效、可移植的编程语言,以便…

Spring 事件相关知识ApplicationEvent

Spring 事件相关知识ApplicationEvent 事件工作流程相关类ApplicationListenerApplicationEvent 我们可以发布自己的事件ApplicationEventPublisher Spring框架中提供了多种事件类型,常用的几个事件类型如下: Spring 事件驱动模型是 Spring 框架中的一个…

SQL查询语言(3) 嵌套查询

如果不进行去重可能会出现一个情况 嵌套查询根据子查询的结果是否依赖于外层循环,分成相关子查询和不相关子查询 分类 IN 笔者总结:一般这种方法适用于查找有共性的元组,同一类事物比如查找和elsa选修相同科目的学生/选修相同科目的女同学。在后面我…

生成对抗性网络简介

生成对抗性网络简介 1. 原理1. GANs如何工作2. GAN架构3. 培训GAN4. 艺术家与评论家5. 评估指标6. GAN变体7. GAN应用8. 图像合成(Image synthesis)9. 图像到图像的转换(Image-to-image translation)10. 文本到图像(Text-to-Image)11. 超越图像12. 其他GAN应用参考这篇博…

计算机网络自顶向下方法笔记03

《计算机网络自顶向下方法》学习笔记03:网络层。 网络层提供了主机到主机的通信服务。网络中的每一台主机和路由器都有网络层部分。网络层能够被分解为两部分,数据平面和控制平面。 第四章 网络层:数据平面 1.概述 网络层的任务是取得源主机的报文段…

Shell脚本的基本运算符应用

记录:432 场景:Shell脚本的基本运算符应用。一般包括算术运算符、关系运算符、布尔运算符、逻辑运算符、字符串运算符、文件检测运算符。 版本:CentOS Linux release 7.9.2009。 1.算术运算符 1.1运算符 算术运算符。 :加法…

基于SSM的甜品店商城系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 随着社会经济的发展和…