Spring cloud alibaba -Seata

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 分布式事务框架Seata 分享篇

3.Seate

事务协调者TC

事务管理器TM

资源管理器RM

  • AT    首推
  • TCC
  • SAGA
  • XA

AT  (auto transation)

无侵入

1.一阶段:

拦截业务SQL

before/after  image  undo/redo

TCC

缺点:侵入性强,需要自己完成对应的业务控制逻辑

优点:性能强(基本无锁)
修改config.txt

事务分组: 异地机房停电容错机制

service.vgroupMapping.my_test_tx_group=default

(比如 shanghai、guangzhou)对应的client也要去设置

运行

3.1   Seata的使用(DB模式)

1.新建数据库   表结构需要在 github上面 alibaba-seata 下载

导入SQL之后

2.新建两个项目  order  stock

1.引入 seata 的依赖

每个服务pom引入

<!--nacos服务注册发现--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--添加openfeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--添加seata--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>


2.添加 undo_Log 表

如果公共一个数据库 只添加一个

DROPTABLEIFEXISTS`undo_log`;
CREATETABLE`undo_log`  (
`id`int(0) NOTNULLAUTO_INCREMENT,
`branch_id`bigint(0) NOTNULL,
`xid`varchar(100) CHARACTERSETutf8mb4COLLATEutf8mb4_0900_ai_ciNOTNULL,
`context`varchar(128) CHARACTERSETutf8mb4COLLATEutf8mb4_0900_ai_ciNOTNULL,
`rollback_info`longblobNOTNULL,
`log_status`int(0) NOTNULL,
`log_created`datetime(0) NULLDEFAULTNULL,
`log_modified`datetime(0) NULLDEFAULTNULL,
PRIMARYKEY (`id`) USINGBTREE,
UNIQUEINDEX`ux_undo_log`(`id`, `branch_id`) USINGBTREE) ENGINE=InnoDBCHARACTERSET=utf8mb4COLLATE=utf8mb4_0900_ai_ciROW_FORMAT=Dynamic;
配置application.ymlserver:
port: 30001spring:
application:
name: order-seatadatasource:
username: rootpassword: rooturl: jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&serverTimezone=UTCdriverClassName: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourcejpa:
show-sql: truehibernate:
ddl-auto: updateproperties:
hibernate:
format_sql: trueenable_lazy_load_no_trans: trueopen-in-view: falsecloud:
alibaba:
seata:
tx-service-group: guangzhou#配置事务分组nacos:
discovery:
serverAddr: 127.0.0.1:8848username: nacospassword: nacosseata:
registry:
#配置seata的注册中心,告诉seataclient怎么去访问seataserver(TC)
type: nacosnacos:
serverAddr: 127.0.0.1:8848#SEATAServer所在acos服务地址application: seata-server#SEATAServer所在服务名seata-server如果没有修改可以不配username: nacospassword: nacosgroup: SEATA_GROUP#SEATAServer所在的组默认就是SEATA_GROUP如果没有修改可以不配config:
#配置seata的配置中心type: nacosnacos:
serverAddr: 127.0.0.1:8848username: nacospassword: nacosgroup: SEATA_GROUPserver:
port: 30002spring:
application:
name: stock-seatadatasource:
username: rootpassword: rooturl: jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&serverTimezone=UTCdriverClassName: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourcejpa:
show-sql: truehibernate:
ddl-auto: updateproperties:
hibernate:
format_sql: trueenable_lazy_load_no_trans: trueopen-in-view: falsecloud:
nacos:
discovery:
serverAddr: 127.0.0.1:8848username: nacospassword: nacosalibaba:
seata:
tx-service-group: guangzhou#这里必须和config.txt里面的内容保持一致seata:
registry:
#配置seata的注册中心,告诉seataclient怎么去访问seataserver(TC)
type: nacosnacos:
serverAddr: 127.0.0.1:8848#SEATAServer所在nacos服务地址application: seata-server#SEATAServer所在服务名seata-server如果没有修改可以不配username: nacospassword: nacosgroup: SEATA_GROUP#SEATAServer所在的组默认就是SEATA_GROUP如果没有修改可以不配config:
#配置seata的配置中心type: nacosnacos:
serverAddr: 127.0.0.1:8848username: nacospassword: nacosgroup: SEATA_GROUP
3.业务代码实现

使用的是Spring Data JPA 需要引入 spring data jpa 依赖

/*** @ClassName OrderInfo* @Description* @Author Jackson* @Date 2023/5/4* @Version 1.0**/@Data@AllArgsConstructor@NoArgsConstructor@Entity@Table(name="order_info")
publicclassOrderInfoimplementsSerializable {
@Id@GeneratedValue(strategy=GenerationType.IDENTITY)
@ColumnprivateIntegerorderId;
@ColumnprivateStringgoodId;
@ColumnprivateLonggoodNum;
@ColumnprivateStringremark;
@ColumnprivateStringcustomerId;
}
CREATETABLE`stock_info` (
`stock_id`intNOTNULL,
`count_num`bigintDEFAULTNULL,
`good_id`varchar(12) CHARACTERSETutf8mb4COLLATEutf8mb4_0900_ai_ciDEFAULTNULL,
PRIMARYKEY (`stock_id`)
) ENGINE=MyISAMDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_0900_ai_ci;
模拟库存不足的情况下抛异常//OrderServiceImpl@GlobalTransactional@OverridepublicStringsaveOrder(OrderInfoorderInfo) {
orderInfoDao.save(orderInfo);
Stringresult=stockService.reduct(orderInfo.getGoodId(), orderInfo.getGoodNum());
if ("库存不足".equals(result)) {
thrownewBizException("库存不足");
     }
returnresult;
 }
//OrderController//模拟请求@GetMapping("save")
publicStringsaveOrder() {
ThreadLocalRandomthreadLocalRandom=ThreadLocalRandom.current();
longgoodNum=threadLocalRandom.nextLong(1,10);
OrderInfoorderInfo=newOrderInfo(0, "shoes001", goodNum, "alibaba", "9527");
try {
orderService.saveOrder(orderInfo);
    } catch (Exceptione) {
return"库存不足";
    }
return"success";
}


4.验证结果

订单表 order_info

库存表

stock_Info

初始库存

最终库存

当库存不足时 服务抛出异常  订单记录回滚   不会出现 订单存在 库存为扣减异常现象

Seata AT模式 工作 rollback  

PhaseTwo_Rollbacked  第二阶段回滚

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
SpringCloudAlibaba API 开发者
新版-SpringCloud+SpringCloud Alibaba
新版-SpringCloud+SpringCloud Alibaba
|
3月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
126 1
|
1月前
|
JSON SpringCloudAlibaba Java
Springcloud Alibaba + jdk17+nacos 项目实践
本文基于 `Springcloud Alibaba + JDK17 + Nacos2.x` 介绍了一个微服务项目的搭建过程,包括项目依赖、配置文件、开发实践中的新特性(如文本块、NPE增强、模式匹配)以及常见的问题和解决方案。通过本文,读者可以了解如何高效地搭建和开发微服务项目,并解决一些常见的开发难题。项目代码已上传至 Gitee,欢迎交流学习。
131 1
Springcloud Alibaba + jdk17+nacos 项目实践
|
1月前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
2月前
|
SQL NoSQL 数据库
SpringCloud基础6——分布式事务,Seata
分布式事务、ACID原则、CAP定理、Seata、Seata的四种分布式方案:XA、AT、TCC、SAGA模式
SpringCloud基础6——分布式事务,Seata
|
2月前
|
人工智能 前端开发 Java
Spring Cloud Alibaba AI,阿里AI这不得玩一下
🏀闪亮主角: 大家好,我是JavaDog程序狗。今天分享Spring Cloud Alibaba AI,基于Spring AI并提供阿里云通义大模型的Java AI应用。本狗用SpringBoot+uniapp+uview2对接Spring Cloud Alibaba AI,带你打造聊天小AI。 📘故事背景: 🎁获取源码: 关注公众号“JavaDog程序狗”,发送“alibaba-ai”即可获取源码。 🎯主要目标:
95 0
|
3月前
|
人工智能 前端开发 Java
【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)
本文介绍了如何使用 **Spring Cloud Alibaba AI** 构建基于 Spring Boot 和 uni-app 的聊天机器人应用。主要内容包括:Spring Cloud Alibaba AI 的概念与功能,使用前的准备工作(如 JDK 17+、Spring Boot 3.0+ 及通义 API-KEY),详细实操步骤(涵盖前后端开发工具、组件选择、功能分析及关键代码示例)。最终展示了如何成功实现具备基本聊天功能的 AI 应用,帮助读者快速搭建智能聊天系统并探索更多高级功能。
1361 2
【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)
|
3月前
|
Java 微服务 Spring
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
文章介绍了如何利用Spring Cloud Alibaba快速构建大型电商系统的分布式微服务,包括服务限流降级等主要功能的实现,并通过注解和配置简化了Spring Cloud应用的接入和搭建过程。
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
|
4月前
|
负载均衡 Java Spring
Spring cloud gateway 如何在路由时进行负载均衡
Spring cloud gateway 如何在路由时进行负载均衡
508 15
|
3月前
|
关系型数据库 MySQL 数据库
SpringCloud2023中使用Seata解决分布式事务
对于分布式系统而言,需要保证分布式系统中的数据一致性,保证数据在子系统中始终保持一致,避免业务出现问题。分布式系统中对数据的操作要么一起成功,要么一起失败,必须是一个整体性的事务。Seata简化了这个使用过程。
89 2

热门文章

最新文章

下一篇
无影云桌面