Seata实现分布式事务

分布式事务框架Seata的实现原理 介绍 分布式事务相关概念 事务: 并发控制的单元,是用户定义的一组操作序列,需要满足ACID属性。 本地事务:事务由本地资源管理器管理。 分布式事务:事务的操作位于不同的节点。 分支事务:在分布式事务中,由资源管理器管理的本地事务。 全局事务:一次性操作多个资源管理器完成的事务,由一组分支事务组成。 分布式事务实现规范 对于本地事务,可以借助DBMS系统来实现事务的管理,但是对于分布式事务,它就无能为力了。对于分布式事务,目前主要有2种思路:XA协议的强一致规范以及柔性事务的最终一致性规范。 阅读详情

以下是使用 Seata 实现分布式事务管理的详细步骤及代码示例,结合其 AT 模式(自动补偿模式)进行说明:


一、环境准备

  1. 部署 Seata Server(TC)

    • 下载 Seata Server(推荐 1.6.x 版本)并解压。
    • 配置存储模式(推荐 db 模式,高可用):
      # conf/application.yml
      seata:
        store:
          mode: db
          db:
            driver-class-name: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://localhost:3306/seata?useSSL=false
            username: root
            password: root
      
    • 创建 Seata Server 所需的数据库表(global_table, branch_table, lock_table)。
    • 启动 Seata Server:
      sh bin/seata-server.sh -p 8091 -m db
      
  2. 业务数据库准备
    在每个业务数据库中创建 undo_log 表,用于数据回滚(快照表):

    CREATE TABLE `undo_log` (
      `id` BIGINT NOT NULL AUTO_INCREMENT,
      `branch_id` BIGINT NOT NULL,
      `xid` VARCHAR(100) NOT NULL,
      `rollback_info` LONGBLOB NOT NULL,
      `log_status` INT NOT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
    );
    

二、项目集成 Seata Client

1. 添加依赖

在 Spring Boot 项目的 pom.xml 中引入 Seata 依赖:

<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
    <version>1.6.1</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
2. 配置文件

在 application.yml 中配置 Seata 客户端:

seata:
  enabled: true
  application-id: order-service
  tx-service-group: my_tx_group  # 事务组名,需与TC配置一致
  service:
    vgroup-mapping:
      my_tx_group: default       # 映射到TC集群
  registry:
    type: nacos                  # 注册中心类型
    nacos:
      server-addr: 127.0.0.1:8848
  config:
    type: nacos                  # 配置中心类型
3. 数据源代理

Seata 通过代理数据源实现 SQL 解析和自动补偿。若使用 seata-spring-boot-starter,数据源代理默认开启,无需额外配置。


三、代码实现

1. 开启全局事务

在发起分布式事务的方法上添加 @GlobalTransactional 注解:

@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private StockFeignClient stockFeignClient;

    @GlobalTransactional  // 开启全局事务
    public void createOrder(Order order) {
        // 1. 本地事务:创建订单
        orderMapper.insert(order);
        
        // 2. 远程调用:扣减库存
        stockFeignClient.decreaseStock(order.getProductId(), order.getQuantity());
        
        // 若任意步骤失败,Seata自动回滚
    }
}
2. Feign 客户端配置

确保 Feign 支持事务上下文传递(禁用 Hystrix):

feign:
  hystrix:
    enabled: false
3. 分支事务处理

远程服务(如库存服务)无需显式标记分支事务,Seata 自动通过数据源代理管理本地事务。


四、AT 模式执行流程

  1. 第一阶段(提交前)

    • Seata 代理数据源,解析 SQL 并生成 before_image(前镜像)和 after_image(后镜像),写入 undo_log 表。
    • 向 TC 注册分支事务,锁定全局数据。
    • 提交本地事务(业务数据与 undo_log 一并提交)。
  2. 第二阶段(提交/回滚)

    • 提交:TC 通知所有 RM 异步删除 undo_log。
    • 回滚:TC 通知 RM 根据 undo_log 生成反向 SQL 恢复数据,并删除日志。

五、注意事项

  1. 全局锁冲突
    AT 模式依赖全局锁,高并发场景可能引发锁竞争,可通过调整锁超时时间或切换为 TCC 模式优化。
  2. 幂等性处理
    远程服务需支持幂等(如通过唯一业务 ID),避免重复提交。
  3. 异常传递
    业务代码需显式抛出异常触发回滚,避免 try-catch 吞没异常。
  4. 版本兼容性
    Seata 版本需与 Spring Boot、Spring Cloud Alibaba 版本匹配。

六、完整示例代码结构

├── order-service          # 订单服务
│   ├── src/main/java
│   │   └── com/example/order
│   │       ├── controller/OrderController.java
│   │       ├── service/OrderService.java
│   │       └── config/SeataConfig.java
│   └── application.yml
├── stock-service          # 库存服务
│   ├── src/main/java
│   │   └── com/example/stock
│   │       ├── controller/StockController.java
│   │       └── service/StockService.java
│   └── application.yml

七、扩展:TCC 模式

若业务需要更细粒度控制(如资金转账),可切换至 TCC 模式:

  1. 定义 Try、Confirm、Cancel 接口。
  2. 实现资源预留(Try)、提交确认(Confirm)和补偿回滚(Cancel)逻辑。

总结

Seata 的 AT 模式 通过代理数据源和自动生成回滚日志,显著降低了分布式事务的侵入性,适合中小型系统快速集成。关键步骤包括部署 TC、配置 Client、添加 @GlobalTransactional 注解及处理幂等性。实际应用中需结合业务场景选择事务模式,并通过监控和日志优化系统健壮性。

分布式事务Seata的使用详解 Seata 是一款开源的分布式事务解决方案,它可以帮助用户在分布式系统中实现 ACID 事务。Seata 提供了高效、简单、易用的分布式事务解决方案,支持多种语言和多种场景,如微服务架构、云原生应用等。 阅读详情

相关推荐

Seata学习

事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中,一个事务由一组SQL语句组成。事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。原子性(atomicity):个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么 都不做。一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态,事务 的中间状态不能被观察到的。隔离性(isolation)

m0_52208135的博客 8568

SpringCloud +Seata 实现分布式事务,Nacos 为配置中心

SpringCloud +Seata 实现分布式事务,Nacos 作为 Seata 配置中心 1. seata 下载 下载 2. 启动Nacos 之前文档已写过 3. 启动Seata-Server Seata-Server 需要使用注册中心,并把事务数据保存到数据库中,以 Nacos 为例 修改registry.conf的注册中心配置 registry { type = "nacos" nacos { application = "demo-seata-server" # 之

u014087208的博客 30万+

基于seata实现分布式事务

基于seata实现分布式事务本地事务和分布式事务的区别什么是CAP理论2PCSeata方案Seata实现2PC 本地事务和分布式事务的区别 本地事务是基于关系型数据库的,该数据库应用于同一个服务器。 分布式事务:不同微服务对同一个或者不同数据库的操作,或者同一个微服务对不同数据库的操作。比如注册用户送积分。 什么是CAP理论 一致性、可用性、分区容忍性 2PC 事务管理器负责 决策整个分布式事务的提交和回滚,事务参与者负责自己本地事务的提交和回滚 Seata方案 Seata是一个开源的分布式事务框架

weixin_43272286的博客 305

使用Seata实现分布式事务

Seata的设计目标是对业务无侵入,因此从业务无侵入的两阶段提交方案着手,在传统两阶段提交的基础上演进。他把一个分布式事务理解成一个包含了若干分支事务的全局事务。全局事务的职责是协调其下管辖的分支事务达成一致,要么一起成功提交,要么一起失败回滚。此外,通常分支事务本身就是一个关系数据库的本地事务。Seata主要由三个重要组件组成,其中TC(Transaction Coordinator)事务协调器,用来管理全局的分布式事务的状态,用于全局性事务的提交和回滚。

Ahjbvj的博客 1147

springcloud集成seata实现分布式事务

springcloud集成Seata实现分布式事务

m0_52620144的博客 2030

第十章 Seata--分布式事务

承接上篇 ,终于我们迎来了最后一章 第九章 Nacos Config–服务配置,第十章 Seata–分布式事务,感谢你能学习到这 !废话不多说,撸码 10.1 分布式事务基础 10.1.1 事务 事务指的就是一个操作单元,在这个操作单元中的所有操作最终要保持一致的行为,要么所有操作都成功,要么所有的操作都被撤销。简单地说,事务提供一种“要么什么都不做,要么做全套”机制。 10.1.2 本地事...

程序员小刘 3356

springCloud整合seata实现分布式事务

seata简介 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 对业务无侵入:即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入 高性能:减少分布式事务解决方案所带来的性能消耗 seata术语 TC (Transaction Coordinator)事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回...

m0_59708021的博客 509

【ESP32-S3量产指南】基于Flash下载工具实现Release模式Flash加密与安全配置

本文详细介绍了ESP32-S3量产阶段如何通过Flash下载工具实现Release模式下的Flash加密与安全配置。从加密模式选择、工具配置到分区表优化,提供了一套完整的量产安全解决方案,帮助开发者有效防止固件泄露和篡改,确保设备安全。

weixin_28730131的博客 230

Seata分布式事务实现原理深度剖析

在单体架构向微服务架构演进的过程中,"数据一致性"始终是悬在开发者头顶的一把利剑。我在八年Java开发生涯中,曾多次面对这样的场景:一个支付流程需要调用订单服务、账户服务、积分服务,若某一步骤突然失败(如网络波动、服务宕机),如何保证"订单创建了但账户没扣款"或"扣款成功但积分未到账"的情况不会发生?传统的本地事务(如Spring的)依赖数据库的ACID特性,在单库场景下表现完美,但在跨服务、跨数据库的分布式场景中却完全失效。

excellent_fish_c的博客 1277

手把手教你用vLLM在昇腾910B上部署Qwen3-Embedding-8B模型(保姆级避坑指南)

本文详细介绍了如何在昇腾910B芯片上使用vLLM推理引擎部署Qwen3-Embedding-8B模型的全流程,包括环境准备、vLLM-ascend定制化安装、模型获取与校验、环境变量配置、服务启动参数优化、性能压测及生产级部署建议。特别针对昇腾生态的开发者,提供了保姆级的避坑指南和实用技巧,帮助实现高效稳定的模型部署。

weixin_28726671的博客 463

告别手动核对!用这个ABAP报表一键导出所有物料的库存与需求清单

本文介绍了如何通过定制化ABAP报表一键导出SAP系统中所有物料的库存与需求清单,整合MD04、MB52、ME2N等多个事务码的数据,大幅提升供应链管理和生产计划效率。该报表可自动生成包含库存状态、MRP需求、采购订单等关键指标的物料全景视图,帮助企业减少手工操作错误,节省时间成本。

weixin_33725515的博客 467

seata分布式事务的实现和部署搭建

大家都知道事务的概念:访问或者更新数据库数据的一个程序执行单元。一个事务是由一组sql语句组成的;且具有ACID特性,即原子性、隔离性、持久性、一致性。随着分布式微服务的发展,数据库拆分和服务化(SOA),便产生了分布式事务的概念。简单讲,就是服务操作涉及多个数据库。场景一:最早的分布式事务架构很简单,不涉及服务间的调用,仅仅是服务内操作涉及到对多个数据库的访问。场景二:一个服务操作需要调用另外一个服务,这时的事务就需要跨越多个服务了。

lchmyhua88的博客 1673

【客户案例】母婴行业头部品牌是如何做私域的

各品牌争相跑马圈地,想方设法圈住流量,建立品牌资产;私域运营是一项“重人力”的工作,在传统的品牌运营过程中,私域操盘手经常会由于一对多导致无法兼顾,只能通过提高触达次数的方式加大漏斗,这样难以让每个社群都发挥出应有的价值,甚至还会导致一定程度的用户流失。除了宝妈身份外激发的用户认同感、亲密度外,KOC们作为产品的使用者,自由选择的推品和自由创作的推广文案都更具有真实性、代表性,能够极大程度激发群友们的信任感,从而愿意为产品买单,转化复购水到渠成。不同阶段的宝妈,母婴知识的储存量和经验是不同的,K品牌还会。.

圈量SCRM系统-企微营销工具-私域流量运营软件 947

Seata分布式事务实现原理剖析

作为一名有八年Java开发经验的后端工程师,我在多个中大型系统中都遇到过分布式事务的需求。传统的本地事务(如Spring的`@Transactional`)在单体架构中可以很好地保证数据一致性,但在微服务架构中,它显得力不从心。

Minoz_wl的博客 1311

(王道408考研操作系统)第一章计算机系统概述-第三节2:中断和异常

注意!!! 本节内容和《计算机组成原理》中的中断有重合,如果需要详细了解的话可以点击链接跳转:(计算机组成原理)第七章输入和输出系统-第四节2:I/O方式之程序中断方式 为了内容完整,部分内容会借用上述文章 文章目录一:中断和异常的基本概念(1)中断和异常的定义 一:中断和异常的基本概念 在操作系统引入核心态和用户态这两种工作状态后,就需要考虑两种状态之间是如何切换的。 操作系统内核工作在核心态,用户程序工作在用户态,系统不允许用户程序使用核心态的功能,但是用户程序为了完成某些操作又必须使用这些功能

快乐江湖的博客 3530

日常工作记录---在虚拟机中进行slam建图

   今天是10月24号,首先祝各位程序员们节日快乐!!!    最近一周由于实习的原因,对ROS的探索学习,停滞了一段时间,所以今天也就没什么大的进展,本篇文章仅仅记录一下,我在虚拟机中进行slam建图可行性验证的过程,本篇文章同样使用古月学院《如何在Gazebo中实现阿克曼转向车的仿真》的课程资料来进行验证    下面各条之间并没有严格的顺序关系,每一条都是独立的,都是我在验证过程中的经验或者记录:    1、在运行roslaunch bringup racecar_gazebo_rviz.lau

慕羽★的博客 4828

Seata分布式事务实现原理

Seata通过创新的AT模式降低了分布式事务的使用门槛,结合灵活的多模式支持,已成为云原生时代分布式事务的首选方案。深入理解其核心实现原理,是构建高可靠事务系统的关键。

KBkongbaiKB的博客 952

ICM20948 DMP代码详解(69)

ICM20948 DMP代码详解(69)

phmatthaus的专栏 615

springcloud整合seata实现分布式事务

概览 操作步骤如下: 1.seata-server端,修改server配置 2.client端(你自己的项目),引入配置文件,修改配置文件 3.数据源代理设置 4.创建数据库表 5.启动注册中心(eureka),启动server,启动client(包括订单服务,库存服务、账户服务) 1.此demo技术选型及版本信息 注册中心:eureka 2.1.2 服务间调用:feign 2.1.2...

琦彦 9589

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

spring cloud使用seata实现分布式事务控制

在spring cloud技术栈中分布式事务也是比较重要的一环,分布式事务的处理关系到了数据的一致性和完整性,所以微服务的开发分布式事务是必不可少的,这也对开发人员也是不小的挑战,好在市面上不缺分布式事务的解决方案,这些方案也各有优劣,本次将把seata作为分布式事务的解决方案来进行代码实现,在这之前我特意找了点资料给大家参考 分布式事务的三种解决方案: https://www.cnblogs.com/bluemiaomiao/p/11216380.html seata原理解析:https://www.

技术成就梦想 872

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SpringBoot整合seata实现分布式事务统一

虽然分布式事务在系统解耦方面能保持事务的一致性,但是在整合了seata这一类的事务统一中间件之后,不管中间件的性能多好,都会增加系统的复杂度和性能开销,在高并发的使用场景下尤为明显。

qq_43774332的博客 2383

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

springboot项目使用seata实现分布式事务

springboot项目使用seata实现分布式事务 正文 我们简单地了解了一下什么是seata。它是来自阿里巴巴的内部项目不断地发展出来的。 2019年以fescar命名开源于apache开源协议,同年改名为seata。 本文将入手seata,官方的文档和demo主要以dubbo和springcloud体系的接入为主。 本文选取springboot作为项目构建框架,快速构建示例。 环境说明 seata的发展还是比较快的,而版本的更新带来的使用变化可能会导致文档的过时。 本文在阅读官方提供的quickSt

小学僧的博客 1787
上一篇: Sentinel控制台解决雪崩问题
下一篇: 同步通信和异步通信的区别和使用场景
小李不秃头♛
博客等级 码龄2年 619粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值