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. SQL 时间范围和时间粒度

    前言 使用 SQL 进行业务数据计算时,经常会遇到两个概念:时间范围 和 时间粒度 .以 最近一天的每小时的用户访问人数 为例: 最近一天 是时间范围 每小时 是时间粒度 常见的时间范围:最近五分钟. ...

  2. 企业使用erp系统的好处及解决了什么问题?

    不是所有的企业使用ERP都能带来好处的,尤其是对于一些小微企业,带来的可能是灾难,而实施不适用的系统同样也会带来意想不到的后果,所以在ERP的使用方面得根据自己企业实际做决定.不同规模的企业选用不同的 ...

  3. WPF开发经验-实现Win10虚拟触摸键盘

    一 引入 项目有个需求,需要实现纯触控操作进行键盘输入.项目部署在Win10系统上,考虑有两种方案来实现. 通过调用Win10自带的触摸键盘来实现: 通过WPF实现一个触摸键盘来实现: 二 调用Win ...

  4. 云原生强大且灵活的持续集成CI开源框架Tekton实战-上

    @ 目录 概述 定义 常见CICD工具 使用好处 组件 基本概念 安装 前提条件 安装Tekton Pipelines 创建并运行任务 安装Dashboard 安装Cli Pipelines示例演示 ...

  5. HDU4734 F(x) (数位DP)

    (如此简短的题目给人一种莫名的压迫感......) 题目中定义一个数的权值求解函数:F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1. 观察 ...

  6. 🔥支持 Java 19 的轻量级应用开发框架,Solon v1.10.4 发布

    Java 轻量级应用开发框架.可用来快速开发 Java 应用项目,主框架仅 0.1 MB. 相对于 Spring Boot 和 Spring Cloud 的项目: 启动快 5 - 10 倍. (更快) ...

  7. 一篇文章带你了解热门版本控制系统——Git

    一篇文章带你了解热门版本控制系统--Git 这篇文章会介绍到关于版本控制的相关知识以及版本控制神器Git 我们可能在生活中经常会使用GitHub网页去查询一些开源的资源或者项目,GitHub就是基于G ...

  8. Mysql知识点整理

    索引相关 abcd联合索引搜索ba会走索引么 会,重排 索引的底层实现是B+树,为何不采用红黑树,B树? (1):B+Tree非叶子节点只存储键值信息,降低B+Tree的高度,所有叶子节点之间都有一个 ...

  9. 基于win11安装Java11环境

    下载JDK解压版本 下载后解压,并放到一个没有中文路径的目录,如图所示: 配置Java环境变量 以Windows11系统为例,打开设置,搜索"环境",点击"编辑系统环境变 ...

  10. 《吐血整理》高级系列教程-吃透Fiddler抓包教程(29)-Fiddler如何抓取Android7.0以上的Https包-终篇

    1.简介 上一篇宏哥介绍的Xposed是一款可以在不修改APK的情况下影响程序运行的框架.可以编写并加载自己编写的插件app,实现对目标apk的注入.拦截等.一般研究移动安全的都会使用Xposed. ...