Spring cloud alibaba -Seata

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 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
目录
相关文章
|
10天前
|
SpringCloudAlibaba API 开发者
新版-SpringCloud+SpringCloud Alibaba
新版-SpringCloud+SpringCloud Alibaba
|
2月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
|
22天前
|
SQL NoSQL 数据库
SpringCloud基础6——分布式事务,Seata
分布式事务、ACID原则、CAP定理、Seata、Seata的四种分布式方案:XA、AT、TCC、SAGA模式
SpringCloud基础6——分布式事务,Seata
|
11天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
554 6
|
2月前
|
人工智能 前端开发 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 应用,帮助读者快速搭建智能聊天系统并探索更多高级功能。
594 2
【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)
|
8天前
|
人工智能 前端开发 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”即可获取源码。 🎯主要目标:
17 0
|
2月前
|
Dubbo Java 调度
揭秘!Spring Cloud Alibaba的超级力量——如何轻松驾驭分布式定时任务调度?
【8月更文挑战第20天】在现代微服务架构中,Spring Cloud Alibaba通过集成分布式定时任务调度功能解决了一致性和可靠性挑战。它利用TimerX实现任务的分布式编排与调度,并通过`@SchedulerLock`确保任务不被重复执行。示例代码展示了如何配置定时任务及其分布式锁,以实现每5秒仅由一个节点执行任务,适合构建高可用的微服务系统。
53 0
|
5月前
|
Nacos 数据库
分布式事务解决方案Seata
分布式事务解决方案Seata
84 1
|
5月前
|
存储 关系型数据库 MySQL
基于Seata实现分布式事务
通过以上步骤,你可以使用 Seata 实现分布式事务,确保在微服务架构中的事务一致性。Seata 支持多种语言和框架,能够满足不同业务场景的需求。欢迎关注威哥爱编程,一起学习成长。
129 1
|
2月前
|
关系型数据库 MySQL 数据库
SpringCloud2023中使用Seata解决分布式事务
对于分布式系统而言,需要保证分布式系统中的数据一致性,保证数据在子系统中始终保持一致,避免业务出现问题。分布式系统中对数据的操作要么一起成功,要么一起失败,必须是一个整体性的事务。Seata简化了这个使用过程。
55 2
下一篇
无影云桌面