Alibaba Spring Cloud 二 Seata 的详细介绍、使用场景以及集成方法

Seata 是一个开源的分布式事务解决方案,它由阿里巴巴开源,专注于解决微服务架构中的分布式事务问题。它支持高性能的分布式事务处理,提供了多种事务模型(AT、TCC、SAGA 和 XA),并与 Spring Boot 和 Spring Cloud 深度集成。

以下是关于 Seata 的详细介绍、使用场景以及集成方法。


1. Seata 的核心概念

1.1 分布式事务的挑战

  • 在微服务架构中,每个服务通常拥有独立的数据库,传统的本地事务无法跨服务进行控制。
  • 常见的分布式事务场景:
    • 创建订单时,需要同时扣减库存和支付金额。
    • 资金转账系统,涉及多个账户的资金一致性。

1.2 Seata 的架构

  1. Transaction Coordinator (TC)

    • 事务协调者,管理全局事务的生命周期。
    • 负责维护全局事务状态,并协调各分支事务的提交或回滚。
  2. Transaction Manager ™

    • 事务管理器,定义全局事务的范围,发起事务的提交或回滚。
  3. Resource Manager (RM)

    • 资源管理器,管理分支事务的资源(如数据库连接)。
    • 负责提交或回滚分支事务。

2. 事务模型

2.1 AT 模式(Automatic Transaction)

  • 自动事务管理,基于二阶段提交协议(2PC)。
  • 适用于关系型数据库事务(MySQL、PostgreSQL 等)。
  • 阶段 1:业务方法执行,生成回滚日志。
  • 阶段 2
    • 提交: 事务成功时,提交操作。
    • 回滚: 事务失败时,根据回滚日志恢复数据。

2.2 TCC 模式(Try-Confirm-Cancel)

  • 手动定义分支事务的三个阶段:
    1. Try:预留资源。
    2. Confirm:提交操作。
    3. Cancel:释放资源。
  • 适用于需要高性能和自定义事务控制的场景。

2.3 SAGA 模式

  • 基于长事务的补偿机制,每个步骤都有前向和回滚操作。
  • 适用于业务操作复杂、状态可补偿的场景。

2.4 XA 模式

  • 基于数据库的两阶段提交协议(XA)。
  • 性能较差,适用于事务一致性要求极高的场景。

3. Seata 的使用场景

  1. 电商系统:
    • 创建订单时,扣减库存、扣款,确保一致性。
  2. 支付系统:
    • 资金转账,多个账户的余额修改。
  3. 物流系统:
    • 订单发货后,更新库存和物流状态。
  4. 金融系统:
    • 贷款审批,涉及账户、利息、合同等多个系统。

4. Seata 的集成步骤

4.1 环境准备

下载和启动 Seata Server
  1. 下载 Seata Server:Seata GitHub。
  2. 修改 conf/registry.conf 配置文件,指定注册中心和配置中心(如 Nacos)。
registry {type = "nacos"nacos {serverAddr = "127.0.0.1:8848"namespace = ""group = "SEATA_GROUP"}
}
config {type = "nacos"nacos {serverAddr = "127.0.0.1:8848"namespace = ""group = "SEATA_GROUP"dataId = "seata.properties"}
}
  1. 启动 Seata Server:
    sh bin/seata-server.sh -p 8091 -m file
    

4.2 Spring Boot 集成

依赖引入

pom.xml 中添加依赖:

<dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.6.1</version>
</dependency>
配置 Seata

application.yml 中添加配置:

seata:enabled: truetx-service-group: my_tx_group
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: rootpassword: root
创建全局事务

使用 @GlobalTransactional 注解开启分布式事务:

@Service
public class OrderService {@Autowiredprivate InventoryService inventoryService;@Autowiredprivate PaymentService paymentService;@GlobalTransactional(name = "create-order", rollbackFor = Exception.class)public void createOrder(Order order) {// 保存订单orderRepository.save(order);// 扣减库存inventoryService.deductStock(order.getProductId(), order.getQuantity());// 扣款paymentService.processPayment(order.getUserId(), order.getTotalAmount());// 如果出现异常,全局回滚if (order.getTotalAmount().compareTo(BigDecimal.ZERO) <= 0) {throw new RuntimeException("无效金额");}}
}

4.3 数据库支持

全局事务表

Seata 需要一张 global_table 存储全局事务信息。SQL 示例:

CREATE TABLE global_table (xid VARCHAR(128) NOT NULL,transaction_id BIGINT,status TINYINT,gmt_create TIMESTAMP,gmt_modified TIMESTAMP,PRIMARY KEY (xid)
);
回滚日志表

Seata 的 AT 模式需要存储回滚日志:

CREATE TABLE undo_log (id BIGINT AUTO_INCREMENT,branch_id BIGINT NOT NULL,xid VARCHAR(128) NOT NULL,rollback_info LONGTEXT NOT NULL,log_status INT NOT NULL,log_created TIMESTAMP NOT NULL,log_modified TIMESTAMP NOT NULL,PRIMARY KEY (id)
);

5. 运行与测试

测试步骤

  1. 启动 Seata Server 和相关服务(Nacos、数据库)。
  2. 运行 Spring Boot 项目。
  3. 模拟事务成功:
    • 创建订单,扣减库存,扣款。
  4. 模拟事务失败:
    • 在事务中抛出异常,观察全局回滚。

6. 常见问题与优化

常见问题

  1. 事务未回滚:

    • 检查 @GlobalTransactional 是否正确配置。
    • 确保 Seata Server 正常运行。
  2. 性能问题:

    • AT 模式适合高性能场景,但需要占用更多数据库资源。
    • 在性能要求较高的场景中,优先选择 TCC 模式。

优化建议

  1. 连接池配置:
    • 使用 HikariCP 提升数据库连接性能。
  2. 分库分表支持:
    • 在分库分表场景中,使用 Seata 结合 ShardingSphere。

7. Seata 与其他分布式事务框架对比

特性SeataTCCSAGAXA
易用性
性能高(AT)
适用场景电商、金融自定义事务长事务强一致性
事务隔离

总结

Seata 提供了多种事务模型,能够高效处理分布式事务问题,特别适合微服务架构下的复杂场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/893529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT结合Excel辅助学术数据分析详细步骤分享!

目录 一.Excel在学术论文中的作用✔ 二.Excel的提示词✔ 三. 编写 Excel 命令 四. 编写宏 五. 执行复杂的任务 六. 将 ChatGPT 变成有用的 Excel 助手 一.Excel在学术论文中的作用✔ Excel作为一种广泛使用的电子表格软件&#xff0c;在学术论文中可以发挥多种重要作用&a…

flume和kafka整合 flume和kafka为什么一起用?

‌Flume和Kafka一起使用的主要原因是为了实现高效、可靠的数据采集和实时处理。‌‌12 实时流式日志处理的需求 Flume和Kafka结合使用的主要目的是为了完成实时流式的日志处理。Flume负责数据的采集和传输,而Kafka则作为消息缓存队列,能够有效地缓冲数据,防止数据堆积或丢…

国内有哪些著名的CRM系统提供商?

嘿&#xff0c;你有没有想过&#xff0c;在这个信息爆炸的时代里&#xff0c;企业怎么才能更好地管理客户关系呢&#xff1f;答案就是使用高效的CRM系统。今天我就来给大家聊聊那些在国际上非常有名的CRM系统提供商吧。 悟空CRM 首先不得不提的就是悟空CRM了&#xff01;这可…

Linux中的几个基本指令(二)

文章目录 1、cp指令例一&#xff1a;例二&#xff1a;例三&#xff1a;例四&#xff1a;例五&#xff1a; 2、mv 指令例一&#xff1a;例二&#xff1a; 3、cat指令例一&#xff1a; 4、tac指令5、which指令6、date指令时间戳&#xff1a;7、zip指令 今天我们继续学习Linux下的…

mock可视化生成前端代码

介绍&#xff1a;mock是我们前后端分离的必要一环、ts、axios编写起来也很麻烦。我们就可以使用以下插件&#xff0c;来解决我们的问题。目前支持vite和webpack。&#xff08;配置超级简单&#xff01;&#xff09; 欢迎小伙伴们提issues、我们共建。提升我们的开发体验。 vi…

【Linux】APT 密钥管理迁移指南:有效解决 apt-key 弃用警告

引言 随着 Debian 11 和 Ubuntu 22.04 版本的推出&#xff0c;APT 的密钥管理方式发生了重大的变化。apt-key 命令被正式弃用&#xff0c;新的密钥管理机制要求使用 /etc/apt/keyrings/ 或 /etc/apt/trusted.gpg.d/ 来存储和管理密钥。这一变化对管理员和普通用户来说至关重要…

9. 神经网络(一.神经元模型)

首先&#xff0c;先看一个简化的生物神经元结构&#xff1a; 生物神经元有多种类型&#xff0c;内部也有复杂的结构&#xff0c;但是可以把单个神经元简化为3部分组成&#xff1a; 树突&#xff1a;一个神经元往往有多个树突&#xff0c;用于接收传入的信息。轴突&#xff1a;…

Web 音视频(二)在浏览器中解析视频

前言 浏览器中已经能直接播放视频&#xff0c;为什么还需要手动写代码解析&#xff1f; 因为&#xff0c;某些场景需要对视频进行更细致的处理&#xff0c;比如截取关键帧、提取视频中的文字、人物打码、极低延时播放视频等等。 总之&#xff0c;除了最单纯的视频播放外&…

代码随想录刷题day14(2)|(链表篇)02.07. 链表相交(疑点)

目录 一、链表理论基础 二、链表相交求解思路 三、相关算法题目 四、疑点 一、链表理论基础 代码随想录 二、链表相交求解思路 链表相交时&#xff0c;是结点的位置&#xff0c;也就是指针相同&#xff0c;不是结点的数值相同&#xff1b; 思路&#xff1a;定义两个指针…

ETLCloud在iPaas中的是关键角色?

在当今的数字化时代&#xff0c;企业越来越依赖于其处理和分析数据的能力。为了实现这一目标&#xff0c;企业需要将各种异构的应用和数据源集成在一起&#xff0c;形成一个统一的数据视图。在这一过程中&#xff0c;ETL&#xff08;Extract, Transform, Load&#xff09;和iPa…

以太网实战AD采集上传上位机——FPGA学习笔记27

一、设计目标 使用FPGA实现AD模块驱动采集模拟电压&#xff0c;通过以太网上传到电脑上位机。 二、框架设计 数据位宽转换模块&#xff08;ad_10bit_to_16bit&#xff09;&#xff1a;为了方便数据传输&#xff0c;数据位宽转换模块实现了将十位的 AD 数据转换成十六位&#…

YOLOv1、YOLOv2、YOLOv3目标检测算法原理与实战第十三天|YOLOv3实战、安装Typora

1.学习哔哩哔哩《YOLOv1、YOLOv2、YOLOv3目标检测算法原理与实战》 炮哥带你学视频链接 第5章 YOLOv3实战 5.1 YOLOv3实战先导 5.2 pycharm与anaconda的安装 之前已经安装过了&#xff0c;见Pytorch框架与经典卷积神经网络与实战第一天|安装PyCharm&Anaconda&#xff0…

C语言常用知识结构深入学习

面试大保健-C语言-变量day01 1. C语言的重要性 大家好&#xff01;今天我们来聊一聊 C 语言。作为嵌入式开发的基础&#xff0c;C语言在面试中必定是一个重点&#xff0c;虽然具体会问到哪些问题不好预测&#xff0c;但可以肯定的是&#xff0c;基础知识绝对不会少问。所以&a…

Java算法——排序

目录 引言1. 插入排序1.1 基本思想1.2 直接插入排序1.3 希尔排序 2. 选择排序2.1 基本思想2.2 直接选择排序2.3 直接选择排序变种2.4 堆排序 3. 交换排序3.1 基本思想3.2 冒泡排序3.3 快速排序3.3.1 快速排序的基本结构3.3.2 Hoare法3.3.3 挖坑法3.3.4 双指针法 3.4 快速排序非…

java字典注入与关联注入

一、注解类 import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Documented Target(ElementType.METHOD) Retent…

数据库SQLite和SCADA DIAView应用教程

课程简介 此系列课程大纲主要包含七个课时。主要使用到的开发工具有&#xff1a;SQLite studio 和 SCADA DIAView。详细的可成内容大概如下&#xff1a; 1、SQLite 可视化管理工具SQLite Studio &#xff1a;打开数据库和查询数据&#xff1b;查看视频 2、创建6个变量&#x…

docker 部署.netcore应用优势在什么地方?

目录 1. 环境一致性 2. 简化依赖管理 3. 快速部署与扩展 4. 资源利用率高 5. 版本控制与回滚 6. 安全性 7. 生态系统支持 8. 微服务架构支持 9. 降低成本 10. 开发体验提升 总结 使用 Docker 部署 .NET Core 应用有许多优势&#xff0c;特别是在开发、测试和生产环境…

YOLOv8改进,YOLOv8检测头融合DSConv(动态蛇形卷积),并添加小目标检测层(四头检测),适合目标检测、分割等

精确分割拓扑管状结构例如血管和道路,对各个领域至关重要,可确保下游任务的准确性和效率。然而,许多因素使任务变得复杂,包括细小脆弱的局部结构和复杂多变的全局形态。在这项工作中,注意到管状结构的特殊特征,并利用这一知识来引导 DSCNet 在三个阶段同时增强感知:特征…

Oracle之Merge into函数使用

Merge into函数为Oracle 9i添加的语法&#xff0c;用来合并update和insert语句。所以也经常用于update语句的查询优化&#xff1a; 一、语法格式&#xff1a; merge into A using B on (A.a B.a) --注意on后面带括号&#xff0c;且不能更新join的字段 when matched then upd…

【DGL系列】dgl中为graph指定CSR/COO/CSC矩阵格式

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 只讲几个注意事项&#xff1a; 1、graph.formats() 函数可以查看graph格式&#xff0c;也可以指定graph格式。 g dgl.graph(([0, 0, 1], [2, 3, 2])…