Seata

本文介绍了Seata分布式事务框架的AT模式和TCC模式。AT模式适用于大部分业务场景,通过自动补偿实现事务,而TCC模式则在复杂场景下提供手动控制事务的能力。详细步骤包括Seata服务器的搭建、配置,以及业务方法上的注解使用。同时,文章提到了TCC模式的两个阶段和三种操作,适用于需要自定义事务处理的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

咋互相通知的

TC事物协调器,当有一个事务内的服务失败,那么TC会通知其他的服务

第一阶段

TM事物管理器,事务协调器生成事物ID下发给事务管理器,事务ID来识别,具体的服务是在那个事物中的,资源管理器RM每一个模块都有,本地事务,回滚都是RM,会先去TC注册一个分支事务,之后执行模块,成功,通过rm发给TC,最后TC把模块执行结果下发给TM

第二阶段

TM进行判断所有的模块的执行结果,执行是否回滚或者提交

Seata-AT事务

举个栗子:

修改数据的时候,底层会先去查旧数据,之后替换,然后再去查询这个数据,再将数据放到日志数据库中

搭建TC事务协调器

1.解压分布式事务\seata-server-1.3.zip

2.修改三个配置

registry.conf 配置注册中心

file.conf 配置数据库,日志存放的位置

seata-server.bat 修改启动配置,减少内存的使用

3.cmd 运行seata-server.bat

  • 必须用jdk1.8运行
  • 命令窗口不能关闭
  • 窗口中内容不能选中

添加Seata at事务

1.父项目添加seata依赖

        

2.三个配置文件

        application.yml(设置一个事务组的名字,同个事务里的模块事务组要相同)

        registry (注册中心的地址)  配置的要去注册中心找,连接事务协调器

        file.conf (事务组对应使用的事务协调器)

TC协调器可以配置多个解决高并发问题

3.创建一个数据源代理对象,添加自动配置类

知识点:配置文件可以直接互相引用

配置类文件中用的是HikariDataSource连接池,其中有个jdbc-url要单独设置

spring 无法分辨该注入拿一个对象的时候设置@Primary设置首选项

其次要去排除spring默认的数据源自动配置添加

4. 业务方法添加注解

  • 控制本地事务:@Transactional
  • 在第一个模块,启动全局事务:@GlobalTransactional

Seata TCC事务

AT事务适用于80%的业务场景(多数情况下)

在一些复杂的情况下,无法自动控制全局事务的执行

需要手动控制事务,没有自动的代码提供了

举个栗子:数据库中有自定义函数,自己写的存储过程的代码,保存到数据库里,当上传数据的时候,想要自己指定具体操作代码的时候,AT就不好使了

TCC(完全手动)

两个阶段的三种操作

  • 第一阶段
    • try 预留资源 冻结数据
      • 减库存:要减掉的库存先进行预留、冻结
      • 建账户:   要扣减的金额先进性预留、冻结
  • 第二阶段
    • ​​​​​​​Confirm -确认提交
      • ​​​​​​​减库存:使用一阶段冻结的库存完成业务数据的处理
      • 减账户:使用一阶段冻结的金额,完成账户扣减
    • Cancel - 取消、回滚
      • 减库存:使用一阶段冻结的库存  恢复回去
      • 减账户:使用一阶段冻结的金额,恢复回去

        原表基础上要添加一个冻结字段或者专门建一个冻结表(表里只存id与冻结的数据)

具体操作案例

添加TCC事务

  1. 新建 Empty project: seata-tcc
  2. seata-at\无事务版本.zip 解压到 seata-tcc 目录
  3. 在 seata-tcc 工程中导入模块
  4. 添加 seata 依赖
  5. 三个配置文件
    • application.yml
    • registry.conf
    • file.conf
  6. 修改Mapper,添加 TCC 的数据库操作
  7. 按 seata tcc 规则,定义 TccAction 接口和实现

       

8.修改业务方法,冻结数据

9.在第一个模块的业务方法上,添加 @GlobalTransactiona

### Seata 分布式事务框架介绍 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务[^3]。它融合了阿里巴巴和蚂蚁金服在分布式事务技术上的积累,并沉淀了新零售、云计算和新金融等场景下丰富的实践经验[^1]。Seata 提供了多种事务模式,包括 AT 模式(推荐)、TCC 模式、SAGA 模式和 XA 模式,为用户打造了一站式的分布式事务解决方案。 通过合理配置和优化,Seata 能够有效解决分布式系统的事务一致性问题,适用于电商、金融、物流等多种业务场景。实际使用时应根据业务特点选择合适的模式,配合完善的监控体系和运维方案,保证系统的高可用性和数据一致性[^2]。 --- ### Seata 分布式事务框架的使用步骤 #### 1. 引入依赖 在项目中引入 Seata 的相关依赖。以下是一个 Maven 项目的依赖示例: ```xml <dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> <version>1.5.0</version> <!-- 根据需要选择版本 --> </dependency> ``` #### 2. 配置事务切面和数据源代理 在 Spring Boot 项目中,取消默认的数据源自动创建,改为使用自定义的数据源,并配置事务切面。以下是主启动类的代码示例: ```java package cn.kt.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) @EnableDiscoveryClient @EnableFeignClients public class SeataOrderMainApp2001 { public static void main(String[] args) { SpringApplication.run(SeataOrderMainApp2001.class, args); } } ``` #### 3. 添加 `@GlobalTransactional` 注解 在需要开启分布式事务的业务方法上添加 `@GlobalTransactional` 注解。例如: ```java import io.seata.spring.annotation.GlobalTransactional; @Service public class OrderService { @Autowired private OrderMapper orderMapper; @GlobalTransactional public void createOrder(Order order) { // 执行订单创建逻辑 orderMapper.insert(order); // 假设调用其他微服务完成支付 paymentService.pay(order.getOrderId(), order.getAmount()); } } ``` #### 4. 配置文件 在 `application.yml` 或 `application.properties` 文件中,配置 Seata 的相关参数。以下是一个简单的配置示例: ```yaml spring: cloud: alibaba: seata: tx-service-group: my_tx_group # 定义事务组名称 seata: enabled: true service: vgroup-mapping: my_tx_group: default # 映射事务组到具体的事务管理器 grouplist: default: 127.0.0.1:8091 # Seata Server 地址 ``` --- ### Seata 的核心概念与原理 #### 1. 三大角色 Seata 的三大核心角色分别为 TM(Transaction Manager)、RM(Resource Manager)和 TC(Transaction Coordinator)[^3]: - **TM**:事务管理器,负责协调整个分布式事务的提交或回滚。 - **RM**:资源管理器,负责管理本地资源(如数据库连接),并将其注册到 TC 中。 - **TC**:事务协调器,作为独立的服务运行,负责维护全局事务的状态并驱动事务的提交或回滚。 #### 2. AT 模式 AT 模式是 Seata 推荐使用的事务模式,具有高效性和易用性。其主要特点如下: - **一阶段提交**:执行业务 SQL 并生成 Undo Log。 - **二阶段提交**:根据全局事务的状态决定提交或回滚。回滚时通过 Undo Log 还原数据状态[^5]。 --- ### 示例代码 以下是一个完整的 Seata 使用示例: #### 主启动类 ```java package com.example.seata; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) @EnableDiscoveryClient public class SeataDemoApplication { public static void main(String[] args) { SpringApplication.run(SeataDemoApplication.class, args); } } ``` #### 数据源配置 ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/seata_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver ``` #### 业务服务类 ```java import io.seata.spring.annotation.GlobalTransactional; @Service public class OrderService { @Autowired private OrderMapper orderMapper; @Autowired private PaymentService paymentService; @GlobalTransactional public void placeOrder(Order order) { // 创建订单 orderMapper.insert(order); // 调用支付服务 paymentService.pay(order.getOrderId(), order.getAmount()); } } ``` --- ### 注意事项 1. 确保 Seata Server 已经正确部署并运行。 2. 配置好 Undo Log 表结构,Seata 默认会自动创建 Undo Log 表。 3. 根据业务需求选择合适的事务模式,例如 AT 模式适合大多数场景,而 TCC 模式适合对性能要求较高的场景。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值