SpringCloud Alibaba(六) - 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 查看数据库


SpringCloud Alibaba(六) - Seata 分布式事务锁的更多相关文章
- SpringCloud(六)分布式事务
在分布式系统中,分布式事务基本上是绕不开的, 分布式事务是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上 .其实就可以简单理解成在分布式系统中实现事务 ...
- Spring Cloud Alibaba | 微服务分布式事务之Seata
Spring Cloud Alibaba | 微服务分布式事务之Seata 本篇实战所使用Spring有关版本: SpringBoot:2.1.7.RELEASE Spring Cloud:Green ...
- SpringCloud微服务实战——搭建企业级开发框架(二十七):集成多数据源+Seata分布式事务+读写分离+分库分表
读写分离:为了确保数据库产品的稳定性,很多数据库拥有双机热备功能.也就是,第一台数据库服务器,是对外提供增删改业务的生产服务器:第二台数据库服务器,主要进行读的操作. 目前有多种方式实现读写分离,一种 ...
- 六:分布式事务一致性协议paxos的分析
最近研究paxos算法,看了许多相关的文章,概念还是很模糊,觉得还是没有掌握paxos算法的精髓,所以花了3天时间分析了libpaxos3的所有代码,此代码可以从https://bitbucket.o ...
- 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存
原文:http://blog.csdn.net/heyewu4107/article/details/71009712 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存 问 ...
- .net core 下的分布式事务锁
原文:.net core 下的分布式事务锁 目录 系统分布式锁的用法 锁的实现 锁的使用 API内的范例: 引用链接 系统分布式锁的用法 公司框架新增功能分布式锁: 锁的性能之王: 缓存 > Z ...
- Dubbo学习系列之十五(Seata分布式事务方案TCC模式)
上篇的续集. 工具: Idea201902/JDK11/Gradle5.6.2/Mysql8.0.11/Lombok0.27/Postman7.5.0/SpringBoot2.1.9/Nacos1.1 ...
- 利用redis实现分布式事务锁,解决高并发环境下库存扣减
利用redis实现分布式事务锁,解决高并发环境下库存扣减 问题描述: 某电商平台,首发一款新品手机,每人限购2台,预计会有10W的并发,在该情况下,如果扣减库存,保证不会超卖 解决方案一 利用数据 ...
- SpringCloud系列之集成分布式事务Seata应用篇
目录 前言 项目版本 项目说明 Seata服务端部署 Seata客户端集成 cloud-web module-order module-cart module-goods module-wallet ...
- Dubbo学习系列之十四(Seata分布式事务方案AT模式)
一直说写有关最新技术的文章,但前面似乎都有点偏了,只能说算主流技术,今天这个主题,我觉得应该名副其实.分布式微服务的深水区并不是单个微服务的设计,而是服务间的数据一致性问题!解决了这个问题,才算是把分 ...
随机推荐
- JAVA SE 基础总结
§ 基础知识 一.程序组织与运行原理 1.1 程序组织 一个 JAVA 程序文件中主要由如下几部分构成: package 声明 public 类:public 类与类文件名相同,因为其是作为该类文件唯 ...
- Redisson多策略注解限流
限流:使用Redisson的RRateLimiter进行限流 多策略:map+函数式接口优化if判断 自定义注解 /** * aop限流注解 */ @Target({ElementType.METHO ...
- 给 SSH 启用二次身份验证
转载自:https://mp.weixin.qq.com/s/ssuhFbfaHxxzGmLg6Y2MjA 目前来说,二次验证(这里就不做过多解释了)是比较常用的安全手段,通过设置二次验证(谷歌或其他 ...
- 11_Swagger
一. 引言 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务. 总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法.参数和模 ...
- 【前端必会】前端开发利器VSCode
介绍 工欲善其事必先利其器,开发工具方面选择一个自己用的顺手的,这里就用VSCode 安装参考 https://www.runoob.com/w3cnote/vscode-tutorial.html ...
- 标题,ico动态化
//获取ico元素 var link = document.querySelector("link[rel*='icon']"); link.href = "image/ ...
- Python编程之定时任务(crontab)详解
引言 python-crontab是python模块,提供了对cron任务的访问,并使得我们可以通过python对crontab文件进行修改. 安装 pip install python-cronta ...
- 记一次 .NET 某企业OA后端服务 卡死分析
一:背景 1.讲故事 前段时间有位朋友微信找到我,说他生产机器上的 Console 服务看起来像是卡死了,也不生成日志,对方也收不到我的httpclient请求,不知道程序出现什么情况了,特来寻求帮助 ...
- 【算法】基础DP
参考资料 背包九讲 一.线性DP 如果现在在状态 i 下,它上一步可能的状态是什么. 上一步不同的状态依赖于什么. 根据上面的分析,分析出状态和转移方程.注意:dp 不一定只有两维或者一维,一开始设计 ...
- http://localhost:8282/user/findsomeuser[object%20Object]
查看vue中的方法的访问路径是否填写正确. 后端: