Spring cloud alibaba -Seata

简介: 分布式事务框架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  第二阶段回滚

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
2月前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
2189 63
|
2月前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
3904 56
|
3月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
2847 1
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
|
2月前
|
人工智能 监控 Java
Spring AI Alibaba实践|后台定时Agent
基于Spring AI Alibaba框架,可构建自主运行的AI Agent,突破传统Chat模式限制,支持定时任务、事件响应与人工协同,实现数据采集、分析到决策的自动化闭环,提升企业智能化效率。
Spring AI Alibaba实践|后台定时Agent
|
4月前
|
人工智能 Java 开发者
邀您参与 “直通乌镇” Spring AI Alibaba 开源竞技挑战赛!
邀您参与 “直通乌镇” Spring AI Alibaba 开源竞技挑战赛!
|
5月前
|
人工智能 数据可视化 Java
性能提升 10 倍, DIFY 模式迁移至 Spring AI Alibaba 模式 零改造实现
将 Dify 应用迁移至 Spring AI Alibaba,可兼顾可视化开发效率与代码工程灵活性,显著提升系统性能与扩展能力,适用于复杂 AI 业务场景。
832 0

热门文章

最新文章