Spring cloud alibaba -Seata

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 分布式事务框架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
目录
相关文章
|
12天前
|
Java Nacos Sentinel
Spring Cloud Alibaba:一站式微服务解决方案
Spring Cloud Alibaba(简称SCA) 是一个基于 Spring Cloud 构建的开源微服务框架,专为解决分布式系统中的服务治理、配置管理、服务发现、消息总线等问题而设计。
133 13
Spring Cloud Alibaba:一站式微服务解决方案
|
19天前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
31 6
|
19天前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
38 5
|
19天前
|
缓存 监控 Java
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
31 5
|
1月前
|
存储 人工智能 Java
Spring AI Alibaba 配置管理,用 Nacos 就够了
本文通过一些实操案例展示了 Spring AI Alibaba + Nacos 在解决 AI 应用中一系列复杂配置管理挑战的方案,从动态 Prompt 模板的灵活调整、模型参数的即时优化,到敏感信息的安全加密存储。Spring AI Alibaba 简化了对接阿里云通义大模型的流程,内置 Nacos 集成也为开发者提供了无缝衔接云端配置托管的捷径,整体上极大提升了 AI 应用开发的灵活性和响应速度。
209 15
|
1月前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
24天前
|
存储 Java 关系型数据库
在Spring Boot中整合Seata框架实现分布式事务
可以在 Spring Boot 中成功整合 Seata 框架,实现分布式事务的管理和处理。在实际应用中,还需要根据具体的业务需求和技术架构进行进一步的优化和调整。同时,要注意处理各种可能出现的问题,以保障分布式事务的顺利执行。
44 6
|
2月前
|
人工智能 Java API
阿里云开源 AI 应用开发框架:Spring AI Alibaba
近期,阿里云重磅发布了首款面向 Java 开发者的开源 AI 应用开发框架:Spring AI Alibaba(项目 Github 仓库地址:alibaba/spring-ai-alibaba),Spring AI Alibaba 项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。本文将详细介绍 Spring AI Alibaba 的核心特性,并通过「智能机票助手」的示例直观的展示 Spring AI Alibaba 开发 AI 应用的便利性。示例源
1245 12
|
2月前
|
人工智能 开发框架 Java
总计 30 万奖金,Spring AI Alibaba 应用框架挑战赛开赛
Spring AI Alibaba 应用框架挑战赛邀请广大开发者参与开源项目的共建,助力项目快速发展,掌握 AI 应用开发模式。大赛分为《支持 Spring AI Alibaba 应用可视化调试与追踪本地工具》和《基于 Flow 的 AI 编排机制设计与实现》两个赛道,总计 30 万奖金。
|
3月前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
2827 18
下一篇
DataWorks