测试分布式事务

简介: 分布式事务涉及多个微服务,各服务拥有独立数据库,无法通过单个@Transactional注解实现全局回滚。如下单时扣减库存成功但订单创建失败,库存无法自动回滚,导致数据不一致。测试表明,本地事务无法解决跨服务事务一致性问题,需引入分布式事务解决方案。

分布式事务是无法通过单个数据库事务去控制的,每个微服务都有自己的数据库,一次下单事务需要订单、购物车、商品服务分别执行自己的本地事务,其中一个执行失败其它本地事务是无法回滚的,比如:扣减库存失败无法回滚清理购物车及创建订单的事务。

下边我们测试下单扣减库存,首先部署交易微服务,交易微服务是第一天布置的作业,这里有几点需要注意:

1.需要在ItemClient接口中增加扣减库存的方法,以供交易服务远程调用,还需要在ItemClientFallbackFactory增加扣减库存的降级逻辑,即现在已有的代码【已实现】

@PutMapping("/stock/deduct")
public void deductStock(@RequestBody List<OrderDetailDTO> items);

2.商品服务中的OrderDetailDTO移到了hm-api工程,凡是引用该类的微服务都需要统一引用hm-api下的OrderDetailDTO【已实现】

3.交易服务启动类 trade-service 注意添加扫描hm-api下的feign接口

@MapperScan("com.hmall.trade.mapper")
@EnableFeignClients(basePackages = {"com.hmall.api"})
@SpringBootApplication(scanBasePackages = {"com.hmall.trade","com.hmall.api"})

4.暂时将“UserContext.getUser()”获取用户id代码固定为“1”。

我们在下单方法代码的最后位置制造异常,如下【注意要有下面的:@Transactional】:

@Override
@Transactional
public Long createOrder(OrderFormDTO orderFormDTO) {
....
if(1==1){
    throw new RuntimeException("测试异常");
}
return order.getId();
}

预期结果是:当扣减库存成功,下单失败,最终扣减库存事务进行回滚。

此时商品库存我们截个图

下边启动:item-service、trade-service,打开交易服务的swagger文档找到下单接口进行测试:

从商品数据库找一个商品id填入请求参数

最终抛出异常,查看商品的库存正常扣除,但是订单数据没有创建成功,最终导致数据不一致。

测试结论:

通过本地事务控制注解 @Transactional是无法控制分布式事务的。

相关文章
|
4天前
|
缓存 监控 调度
阿里云 CDN 计费体系全解析:基础服务、增值服务与选型指南
在内容分发网络(CDN)领域,阿里云凭借全球节点覆盖与灵活的计费模式,成为个人开发者与企业用户的重要选择。其 CDN 服务计费分为基础服务与增值服务两部分,基础服务提供按流量计费、按带宽峰值计费、月结 95 带宽峰值计费三种核心模式,增值服务则根据功能使用情况单独计费。本文基于 今年最新官方文档与实测数据,从计费规则、价格详情、场景适配、成本优化等维度展开解析,为用户提供客观选型参考。
|
6月前
|
数据安全/隐私保护
贴吧自动发帖工具, 贴吧自动评论脚本,顶贴回复发帖插件
这个代码实现了贴吧自动发帖、自动回复、获取帖子列表等功能。主要使用了requests库进行网络请求
|
JavaScript Shell API
FastAPI是什么?
FastAPI是一个现代、高性能的Python Web框架,专为构建API设计。它利用标准的Python类型提示,支持同步及异步编程,并借助Pydantic实现数据验证。FastAPI以卓越的性能媲美Node.js和Go,代码简洁优雅,能自动生成交互式API文档如Swagger UI和ReDoc,方便测试和调试。其对`async`和`await`的支持使之适用于WebSocket等高并发场景。快速上手仅需安装FastAPI和Uvicorn,编写少量代码即可启动服务并访问自动生成的文档界面。FastAPI不仅易于入门,还支持复杂的功能如依赖注入和后台任务,非常适合追求高性能和快速开发的项目。
801 1
|
存储 算法 搜索推荐
掌握区间合并:解决实际问题的算法策略和应用案例【python LeetCode题目56】
掌握区间合并:解决实际问题的算法策略和应用案例【python LeetCode题目56】
|
算法 数据可视化 定位技术
【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏1(附项目源码)
【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏1(附项目源码)
441 0
|
运维 数据可视化 Python
PYTHON中用PROPHET模型对天气时间序列进行预测与异常检测
PYTHON中用PROPHET模型对天气时间序列进行预测与异常检测
|
存储 编解码 人工智能
中科星图——Sentinel-2_MSI_L2A数据集
中科星图——Sentinel-2_MSI_L2A数据集
560 1
|
人工智能 前端开发 JavaScript
对程序员有用的AI角色扮演脚本
对程序员有用的AI角色扮演脚本
329 1
|
Java
Java 反射修改类的常量值、静态变量值、属性值
Java 反射修改类的常量值、静态变量值、属性值
1190 0
|
Linux 数据安全/隐私保护 iOS开发
通过内网穿透远程控制家中Home Assistant智能家居系统
通过内网穿透远程控制家中Home Assistant智能家居系统
874 0