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 分布式事务锁的更多相关文章

  1. SpringCloud(六)分布式事务

    在分布式系统中,分布式事务基本上是绕不开的, 分布式事务是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上 .其实就可以简单理解成在分布式系统中实现事务 ...

  2. Spring Cloud Alibaba | 微服务分布式事务之Seata

    Spring Cloud Alibaba | 微服务分布式事务之Seata 本篇实战所使用Spring有关版本: SpringBoot:2.1.7.RELEASE Spring Cloud:Green ...

  3. SpringCloud微服务实战——搭建企业级开发框架(二十七):集成多数据源+Seata分布式事务+读写分离+分库分表

    读写分离:为了确保数据库产品的稳定性,很多数据库拥有双机热备功能.也就是,第一台数据库服务器,是对外提供增删改业务的生产服务器:第二台数据库服务器,主要进行读的操作. 目前有多种方式实现读写分离,一种 ...

  4. 六:分布式事务一致性协议paxos的分析

    最近研究paxos算法,看了许多相关的文章,概念还是很模糊,觉得还是没有掌握paxos算法的精髓,所以花了3天时间分析了libpaxos3的所有代码,此代码可以从https://bitbucket.o ...

  5. 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存

    原文:http://blog.csdn.net/heyewu4107/article/details/71009712 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存 问 ...

  6. .net core 下的分布式事务锁

    原文:.net core 下的分布式事务锁 目录 系统分布式锁的用法 锁的实现 锁的使用 API内的范例: 引用链接 系统分布式锁的用法 公司框架新增功能分布式锁: 锁的性能之王: 缓存 > Z ...

  7. Dubbo学习系列之十五(Seata分布式事务方案TCC模式)

    上篇的续集. 工具: Idea201902/JDK11/Gradle5.6.2/Mysql8.0.11/Lombok0.27/Postman7.5.0/SpringBoot2.1.9/Nacos1.1 ...

  8. 利用redis实现分布式事务锁,解决高并发环境下库存扣减

    利用redis实现分布式事务锁,解决高并发环境下库存扣减   问题描述: 某电商平台,首发一款新品手机,每人限购2台,预计会有10W的并发,在该情况下,如果扣减库存,保证不会超卖 解决方案一 利用数据 ...

  9. SpringCloud系列之集成分布式事务Seata应用篇

    目录 前言 项目版本 项目说明 Seata服务端部署 Seata客户端集成 cloud-web module-order module-cart module-goods module-wallet ...

  10. Dubbo学习系列之十四(Seata分布式事务方案AT模式)

    一直说写有关最新技术的文章,但前面似乎都有点偏了,只能说算主流技术,今天这个主题,我觉得应该名副其实.分布式微服务的深水区并不是单个微服务的设计,而是服务间的数据一致性问题!解决了这个问题,才算是把分 ...

随机推荐

  1. Kubernetes 多租户:Pod 安全策略

    默认情况下,Kubernetes 允许创建一个有特权容器的 Pod,这些容器很可能会危机系统安全,而 Pod 安全策略(PSP)则通过确保请求者有权限按配置来创建 Pod,从而来保护集群免受特权 Po ...

  2. 谈谈对K8S CNI、CRI和CSI插件的理解

  3. 8.第七篇 验证kube-apiserver及kubeconfig配置详解

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247483818&idx=1&sn=7572b791 ...

  4. 通过堡垒机上传文件报错ssh:没有权限的问题

    背景描述 一台有公网IP的主机安装的有jumpserver,假设为A主机,另外几台没有公网ip的主机,假设其中一个为B主机. 操作 1.通过主机A的公网IP和端口等登录到jumpserver的管理员用 ...

  5. 没有使用IaC的DevOps系统都是耍流氓

    作为现代软件工程的基础实践,基础设施即代码(Infrastructure as Code, IaC)是云原生.容器.微服务以及DevOps背后的底层逻辑.应该说,以上所有这些技术或者实践都是以基础设施 ...

  6. Hive之安装

    Hive安装 1. 依赖hadoop(另有hadoop安装文档) 执行程序运行在yarn上面,需要启动start-yarn.sh 2. 先安装MySQL MySQL安装详见数据库MySQL之安装:ht ...

  7. 使用redis进行手机验证码的验证、每天只能发送三次验证码 (redis安装在虚拟机linux系统中)

    文章目录 1.代码 2.测试结果 2.1.第一次发送 2.2.填写正确的验证码 2.3.填写错误的验证码 连续发送多次验证码 环境准备:虚拟机Linux系统,redis安装在虚拟机中. 前提条件:虚拟 ...

  8. 齐博x1如何开启自定义标签模板功能

    为安全起见,同时也为了避免用户随意添加风格导致默认模板不协调,系统默认关闭了类似V系列的自定义修改模板功能.如下图所示,默认是关闭的 你如果需要启用的话,把下面的代码,参考下图导进去后,就可以增加一个 ...

  9. 14.api根路由

    我们可以通过使用超链接来提高我们APi的内聚力和可发现性   一.为我们的API创建一个根路径 我们的视图有很多个url,但是没有一个入口点,可以使用@api_view创建一个根路径 #views.p ...

  10. 3.CBV视图之csrf补充

    CBV使用csrf装饰器关闭/开启 csrf验证,直接在函数上加装饰器无效的 #方法1 from django.views import View from django.views.decorato ...