首页IT科技springcloudalibaba实战(SpringCloud Alibaba(六) – Seata 分布式事务锁)

springcloudalibaba实战(SpringCloud Alibaba(六) – Seata 分布式事务锁)

时间2025-07-06 02:24:24分类IT科技浏览4162
导读:1、Seata 简介 1.1 Seata是什么...

1、Seata 简介

1.1 Seata是什么

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。AT模式是阿里首推的模式,阿里云上有商用版本的GTS(Global Transaction Service 全局事务服务)。

1.2 Seata的三大角色

在Seata的架构中,一共有三大角色:

TC(Transaction Coordinator)- 事务协调者

维护全局和分支事务的状态,驱动全局事务提交或回滚。

TM(Transaction Manager)- 事务管理器

定义全局事务的范围:开始全局事务、提交或回滚全局事务

RM(Resource Manager)- 资源管理器

管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

其中,TC为单独部署的Server服务端,TM和RM为嵌入到应用中的Client客户端。

1.3 一个分布式事务的生命周期

博客参考:https://blog.csdn.net/qq_41910252/article/details/122517092

2、安装seata

2.1 下载安装包和源码

下载地址:https://github.com/seata/seata/releases

2.2 修改registry,conf 上传配置文件到nacos

2.2.1 复制 registry 文件 2.2.2 修改配置

2.3 上传到nacos的配置列表

使用git窗口# sh nacos-config.sh -h localhost -p 8848

数据库8的修改一下driverClassName

加时区:

2.3 修改config.txt 启动seate 注册到nacos

2.3.1 复制config.txt 2.3.2 修改config.txt 2.3.3 创建seata数据库 2.3.4 启动seata seata-server.bat -h 127.0.0.1 -p 8091

3、项目演示

3.1 模块说明

3.2 依赖

<!-- nacso注册,feign 依赖不再赘述 --> <!-- seata --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> </dependency>

3.4 配置

3.4.1 undo_log表 3.2.1.1 数据库脚本 3.2.1.2 配置 # 服务名 spring: # 数据源配置 datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/seate_order?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT username: root password: root initialization-mode: always # 支持微服务应用启动时自动执行schema。sql脚本 3.2.1.3 后面项目启动后脚本刷入order库,和prod库 3.4.2 seata配置 # seata client配置(顶格写) seata: enabled: true # 开启Seata tx-service-group: my_test_tx_group # 事务服务分组(可以每个应用单独取名, 也可以使用相同的名字)即要和上文中的seata-server的context.txt中service.vgroupMapping.seata_test_tx_group=default一致 enable-auto-data-source-proxy: true # 自动开启数据源代理 registry: type: nacos # 使用nacos注册中心,默认file,访问seata server(TC) nacos: server-addr: 127.0.0.1:8848 # seata server 所在的nacos服务地址 application: seata-server # seata server 的服务名seata-server ,如果没有修改可以不配 group: SEATA_GROUP # seata server 所在的组,默认就是SEATA_GROUP,没有改也可以不配 config: type: nacos nacos: server-addr: 127.0.0.1:8848 # seata server 所在的nacos服务地址 group: SEATA_GROUP # seata server 所在的组,默认就是SEATA_GROUP,没有改也可以不配 service: vgroup-mapping: my_test_tx_group: default # 事务群组(必须与seata-server保持一致) disable-global-transaction: false # 是否禁用全局事务开关 client: rm: report-success-enable: false #是否上报一阶段成功

3.5 主要代码

3.5.1 order模块的下单和远程调用扣减库存

全局事务注解:@GlobalTransactional

/** * Created On : 1/12/2022. * <p> * Author : huayu * <p> * Description: order模块 下单,调用远程扣减库存 */ @Service @Slf4j public class KgcMallSeataOrderServiceImpl implements KgcMallSeataOrderService { @Autowired private KgcMallSeataOrderRepository kgcMallSeataOrderRepository; //执行 下单 @Autowired private KgcMallSeataProdFeignService kgcMallSeataProdFeignService; // 远程调用 执行 扣减库存 @Override @GlobalTransactional // 分布式事务注解,使用的全局事务,后续所有微服务涉及事务操作,都会被统一管理 public KgcMallSeataOrder createSeataOrder(KgcMallSeataOrder kgcMallSeataOrder, Integer count) { //将分布式事务订单入库 KgcMallSeataOrder seataOrder = kgcMallSeataOrderRepository.save(kgcMallSeataOrder); //远程调用商品业务接口,扣减库存 kgcMallSeataProdFeignService.invokeSeataProductStockFeign(kgcMallSeataOrder.getProdId(), count); //返回下单详情 return seataOrder; } } 3.5.2 prod 模块 扣减库存

事务注解:@Transactional

/** * Created On : 1/12/2022. * <p> * Author : huayu * <p> * Description: prod模块 扣减库存 */ @Service public class KgcMallProdServiceImpl implements KgcMallProdService { @Autowired private KgcMallSeataProdRepository kgcMallSeataProdRepository; //执行 扣减库存 @Override @Transactional public KgcMallSeataProduct subSeataProductStock(Integer pid, Integer count) { //查询商品库存 KgcMallSeataProduct kgcMallSeataProduct = kgcMallSeataProdRepository.findById(pid).orElse(null); //判断商品是否存在 if (kgcMallSeataProduct != null) { kgcMallSeataProduct.setProdStock(kgcMallSeataProduct.getProdStock() - count); } KgcMallSeataProduct saveKgcMallSeataProduct = kgcMallSeataProdRepository.save(kgcMallSeataProduct); //模拟运行时异常 if (count == 10) { int a = 10 / 0; } //返回详情 return saveKgcMallSeataProduct; } }

4 测试

4.1 正常下单

4.1.1 发起请求 4.1.2 查看数据库

order数据库下单:

prod数据库扣减库存:

扣减前:

扣减后:

4.2 模拟运行时异常

4.2.1 发起请求 4.2.2 查看数据库

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
请问郓城(山东郓城吧) seo网站排名优化软件是什么(seo教程网站优化上排名推广)