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

news2025/1/24 5:26:36

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: true
  tx-service-group: my_tx_group
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: root
创建全局事务

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

@Service
public class OrderService {

    @Autowired
    private InventoryService inventoryService;

    @Autowired
    private 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.coloradmin.cn/o/2281228.html

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

相关文章

2_高并发内存池_各层级的框架设计及ThreadCache(线程缓存)申请内存设计

一、高并发内存池框架设计 高并发池框架设计&#xff0c;特别是针对内存池的设计&#xff0c;需要充分考虑多线程环境下&#xff1a; 性能问题锁竞争问题内存碎片问题 高并发内存池的整体框架设计旨在提高内存的申请和释放效率&#xff0c;减少锁竞争和内存碎片。 高并发内存…

后端开发基础——JavaWeb(Servlet)

Servlet 关于系统架构 系统架构包括什么形式&#xff1f; C/S架构 B/S架构 C/S架构&#xff1f; Client / Server&#xff08;客户端 / 服务器&#xff09; C/S架构的软件或者说系统有哪些呢&#xff1f; QQ&#xff08;先去腾讯官网下载一个QQ软件&#xff0c;几十MB&…

c++ 与 Matlab 程序的数据比对

文章目录 背景环境数据保存数据加载 背景 ***避免数据精度误差&#xff0c;快速对比变量 *** 环境 c下载 https://github.com/BlueBrain/HighFive 以及hdf5库 在vs 中配置库 数据保存 #include <highfive/highfive.hpp> using namespace HighFive;std::string fil…

Leecode刷题C语言之收集所有金币可获得的最大积分

执行结果:通过 执行用时和内存消耗如下&#xff1a; int dfs(int node, int parent, int f, int* coins, int k, int **children, int *childCount, int **memo) {if (memo[node][f] ! -1) {return memo[node][f];}int res0 (coins[node] >> f) - k;int res1 coins[no…

mybatis(57/134)

今天没什么想法&#xff0c;搭了个转账平台&#xff0c;加深了点之前javaweb的mvc架构的印象&#xff0c;还有异常的抛出处理等

ONNX 简介

ONNX &#xff08;Open Neural Network Exchange&#xff09;是一套表示深度神经网络模型的开放格式&#xff0c;由微软和 Facebook 于 2017 推出&#xff0c;然后迅速得到了各大厂商和框架的支持。目前&#xff0c;在数家机构的共同维护下&#xff0c;ONNX 已经对接了多种深度…

Linux的中断上半部和中断下半部的概念,并利用任务队列(Tasklet)实现中断下半部的处理

中断上半部和中断下半部的介绍 在Linux内核中&#xff0c;中断处理机制被设计成“中断上半部&#xff08;Top Half&#xff09;”和“中断下半部&#xff08;Bottom Half&#xff09;”两个部分&#xff0c;这种设计主要目的是提高系统的中断响应效率&#xff0c;同时减少中断…

数学规划问题2 .有代码(非线性规划模型,最大最小化模型,多目标规划模型)

非线性规划模型 FIrst:转化为标准型 在matlab中求非线性规划的函数 练习题: 典型例题: 最大最小化模型 核心思想&#xff1a; matlab的模型求解 经典例题: 多目标规划模型 基本概念 求解思路: 模型构建步骤 经典例题: 非线性规划模型 非线性规划&#xff08;Nonl…

linux 下tensorrt的yolov8的前向推理(c++ 版本)的实现

一、环境搭建 cuda 11.4 ubuntu 20.04 opencv-4.5.2 1.1 配置tensorrt 根据本机的硬件配置及cuda的版本&#xff0c;选择TensorRT-8.6.1.6的版本&#xff0c;下载网址为: TensorRT SDK | NVIDIA Developer 根据官网的说明&#xff0c;下载对应的压缩包即可。解压后&…

VUE elTree 无子级 隐藏展开图标

这4个并没有下级节点&#xff0c;即它并不是叶子节点&#xff0c;就不需求展示前面的三角展开图标! 查阅官方文档如下描述&#xff0c;支持bool和函数回调处理&#xff0c;这里咱们选择更灵活的函数回调实现。 给el-tree结构配置一下props&#xff0c;注意&#xff01; :pr…

windows git bash 使用zsh 并集成 oh my zsh

参考了 这篇文章 进行配置&#xff0c;记录了自己的踩坑过程&#xff0c;并增加了 zsh-autosuggestions 插件的集成。 主要步骤&#xff1a; 1. git bash 这个就不说了&#xff0c;自己去网上下&#xff0c;windows 使用git时候 命令行基本都有它。 主要也是用它不方便&…

Glary Utilities Pro 多语便携版系统优化工具 v6.21.0.25

Glary Utilities是一款功能强大的系统优化工具软件&#xff0c;旨在帮助用户清理计算机垃圾文件、修复系统错误、优化系统性能等。 软件功能 清理和修复&#xff1a;可以清理系统垃圾文件、无效注册表项、无效快捷方式等&#xff0c;修复系统错误和蓝屏问题。 优化和加速&…

【Python使用】嘿马python基础入门全体系教程第12篇:__init__()方法,说明:【附代码文档】

本教程的知识点为&#xff1a;计算机组成 计算机是由什么组成的&#xff1f; 1. 硬件系统&#xff1a; 2. 软件系统&#xff1a; 目标 运算符的分类 1. 算数运算符 2. 赋值运算符 3. 复合赋值运算符 判断语句和循环语句 if嵌套 1. if嵌套的格式 2. if嵌套的应用 if嵌套执行流程…

从入门到精通:RabbitMQ的深度探索与实战应用

目录 一、RabbitMQ 初相识 二、基础概念速览 &#xff08;一&#xff09;消息队列是什么 &#xff08;二&#xff09;RabbitMQ 核心组件 三、RabbitMQ 基本使用 &#xff08;一&#xff09;安装与环境搭建 &#xff08;二&#xff09;简单示例 &#xff08;三&#xff09;…

【Block总结】WTConv,小波变换(Wavelet Transform)来扩展卷积神经网络(CNN)的感受野

论文解读&#xff1a;Wavelet Convolutions for Large Receptive Fields 论文信息 标题: Wavelet Convolutions for Large Receptive Fields作者: Shahaf E. Finder, Roy Amoyal, Eran Treister, Oren Freifeld提交日期: 2024年7月8日arXiv链接: Wavelet Convolutions for La…

Couchbase UI: Indexes

在Couchbase中&#xff0c;索引的这些指标可以帮助你评估索引的性能和状态。下面是每个指标的详细解释&#xff0c;以及如何判断索引的有效性&#xff1a; 1. Index Name&#xff08;索引名称&#xff09; 描述&#xff1a;每个索引都有一个唯一的名称。这个名称通常会包括表…

(3)STM32 USB设备开发-USB存储设备

例程&#xff1a;STM32USBdevice: 基于STM32的USB设备例子程序 - Gitee.com 本篇为使用芯片内部flash作为USB存储设备的例程&#xff0c;没有知识&#xff0c;全是实操&#xff0c;按照步骤就能获得一个STM32的U盘。本例子是在野火F103MINI开发板上验证的&#xff0c;如果代码…

细说STM32F407单片机电源低功耗StopMode模式及应用示例

目录 一、停止模式基础知识 1、进入停止模式 2、停止模式的状态 3、退出停止模式 4、SysTick定时器的影响 二、停止模式应用示例 1、示例功能和CubeMX项目配置 &#xff08;1&#xff09;时钟 &#xff08;2&#xff09;RTC &#xff08;3&#xff09;ADC1 &#xf…

Blazor-Blazor WebAssmbly项目结构(上)

创建项目 今天我们来创建一个BlazorWebAssmbly项目&#xff0c;来看看项目结构是如何得&#xff0c;我们创建带模板得项目&#xff0c;会创建出一个demo&#xff0c;来看看项目结构。 创建的项目可以直接启动运行&#xff0c;首次启动会看见加载的过程&#xff0c;这个过程…

【2024年终总结】我与CSDN的一年

&#x1f449;作者主页&#xff1a;心疼你的一切 &#x1f449;作者简介&#xff1a;大家好,我是心疼你的一切。Unity3D领域新星创作者&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6; &#x1f449;记得点赞 &#x1f44d; 收藏 ⭐爱你们&#xff0c;么么哒 文章目录 …