Spring cloud alibaba -Seata

本文涉及的产品
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  第二阶段回滚

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
19天前
|
算法 Java 数据库连接
Spring+MySQL+数据结构+集合,Alibaba珍藏版mybatis手写文档
Spring+MySQL+数据结构+集合,Alibaba珍藏版mybatis手写文档
|
1天前
|
消息中间件 Java 持续交付
Spring Cloud Alibaba 项目搭建步骤和注意事项
Spring Cloud Alibaba 项目搭建步骤和注意事项
13 0
Spring Cloud Alibaba 项目搭建步骤和注意事项
|
2天前
|
人工智能 Java Spring
使用 Spring Cloud Alibaba AI 构建 RAG 应用
本文介绍了RAG(Retrieval Augmented Generation)技术,它结合了检索和生成模型以提供更准确的AI响应。示例中,数据集(包含啤酒信息)被加载到Redis矢量数据库,Spring Cloud Alibaba AI Starter用于构建一个Spring项目,演示如何在接收到用户查询时检索相关文档并生成回答。代码示例展示了数据加载到Redis以及RAG应用的工作流程,用户可以通过Web API接口进行交互。
|
21天前
|
Java API Nacos
第十二章 Spring Cloud Alibaba Sentinel
第十二章 Spring Cloud Alibaba Sentinel
38 0
|
21天前
|
存储 前端开发 Java
第十一章 Spring Cloud Alibaba nacos配置中心
第十一章 Spring Cloud Alibaba nacos配置中心
38 0
|
21天前
|
消息中间件 SpringCloudAlibaba Java
第十章 SpringCloud Alibaba 之 Nacos discovery
第十章 SpringCloud Alibaba 之 Nacos discovery
13 1
|
21天前
|
Java Nacos 开发者
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
|
21天前
|
Java API 对象存储
对象存储OSS产品常见问题之使用Spring Cloud Alibaba情况下文档添加水印如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
|
21天前
|
SpringCloudAlibaba Java 数据库
SpringCloud Alibaba微服务 -- Seata的原理和使用
SpringCloud Alibaba微服务 -- Seata的原理和使用
|
21天前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
71 0