百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

Seata是什么?如何在Spring Boot 中整合Seata实现分布式事务管理?

xsobi 2024-12-14 15:45 1 浏览

Seata (Simple Extensible Autonomous Transaction Architecture) 是一个开源的分布式事务解决方案,其主要的作用是用于在微服务架构中实现分布式事务的管理,解决了在微服务架构中各个服务之间的独立部署所带来的数据一致性等问题。

Seata提供了几个核心的组件来实现分布式事务的管理,其中包括了事务管理器、资源管理器和事务协调器。

其中事务管理器(Transaction Manager),主要负责的是全局事务的管理,并且对最终提交的事务进行管理,TM通常集成在应用中,控制分布式事务的生命周期。

资源管理器(Resource Manager),主要负责的是管理实际的数据资源例如,数据库消息队列等,执行分支事务操作,RM 通过拦截资源访问,在事务中执行回滚或提交。

事务协调器(Transaction Coordinator),作为事务的中央控制者,维护全局事务的状态,并协调各个RM提交或回滚事务。

Seata 支持多种分布式事务模式,最常用的是AT 模式(Automatic Transaction),即对数据库层面的分布式事务进行管理,自动管理提交、回滚和补偿。

下面我们就来看看如何在Spring Boot中整合Seata来实现分布式事务。

搭建Seata服务

想要使用Seata服务,根据上面的介绍,我们首先需要部署一个Seata Server,也就是事务协调器(Transaction Coordinator)TC通常作为一个独立服务部署。可以通过如下的步骤来进行部署。

  • 下载Seata Server https://github.com/apache/incubator-seata/releases
  • 使用Docker运行Seata Server。
  • Seata也可以通过Kubernetes进行部署。

添加依赖

在POM文件中需要引入相关的依赖配置,如下所示。

<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
    <version>1.x.x</version>
</dependency>

接下来,就是在配置文件中添加Seata的基本配置,如下所示。

seata:
  enabled: true
  application-id: your-application-name
  tx-service-group: your_tx_group # 事务组名,多个服务保持一致
  service:
    vgroup-mapping:
      your_tx_group: "default"  # 映射事务组到特定的 Seata server 集群
  client:
    rm:
      datasource:
        enable-auto-data-source-proxy: true  # 自动代理数据源,支持分布式事务
    tm:
      commit-retry-count: 5  # 提交重试次数
      rollback-retry-count: 5  # 回滚重试次数
  registry:
    type: "nacos"  # 这里以 Nacos 为例,作为服务注册中心
    nacos:
      application: your-application-name
      server-addr: localhost:8848
  config:
    type: "nacos"
    nacos:
      server-addr: localhost:8848

配置数据源代理

Seata会自动代理数据源来实现事务拦截。所以我们需要在DataSource的配置上将将其代理为Seata的数据源配置,通过配置类的方式来实现相关配置。

import io.seata.rm.datasource.DataSourceProxy;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {

    @Bean
    public DataSource dataSource(DataSource originalDataSource) {
        // 将数据源代理为 Seata DataSource
        return new DataSourceProxy(originalDataSource);
    }
}

使用@GlobalTransactional注解

为了在整体的业务层面上实现分布式事务的操作,我们可以通过Seata中提供的@GlobalTransactional来直接声明分布式事务,在方法上通过这注解来声明分布式事务操作。

import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.stereotype.Service;

@Service
public class OrderService {

    @GlobalTransactional(name = "order-create-transaction", rollbackFor = Exception.class)
    public void createOrder(Order order) {
        // 1. 创建订单
        orderRepository.save(order);
        // 2. 扣减库存
        stockService.decreaseStock(order.getProductId(), order.getCount());
        // 3. 其他操作
    }
}

当createOrder()方法中出现异常时,Seata将会自动回滚整个事务,包括save()和decreaseStock()中的数据库操作。

当然我们需要在SpringBoot的启动类上加上@EnableTransactionManagement注解,来保证分布式事务能够正常生效。

在完成配置和开发后,可以进行事务测试,我们可以在创建订单的过程中来手动的抛出一个异常,来测试Seata会不会因为这个异常来回滚所有的事务。

@GlobalTransactional(name = "order-create-transaction", rollbackFor = Exception.class)
public void createOrder(Order order) {
    // 创建订单
    orderRepository.save(order);
    
    // 扣减库存
    stockService.decreaseStock(order.getProductId(), order.getCount());

    // 模拟异常
    if (order.getCount() > 10) {
        throw new RuntimeException("测试回滚");
    }
}

如果一切配置正确,出现异常后,整个事务应该会被Seata回滚,数据库操作也会复原。

总结

通过以上步骤,可以在Spring Boot 中成功集成 Seata,利用它来实现微服务架构中的分布式事务管理。

相关推荐

好用的云函数!后端低代码接口开发,零基础编写API接口

前言在开发项目过程中,经常需要用到API接口,实现对数据库的CURD等操作。不管你是专业的PHP开发工程师,还是客户端开发工程师,或者是不懂编程但懂得数据库SQL查询,又或者是完全不太懂技术的人,通过...

快速上手:Windows 平台上 cURL 命令的使用方法

在工作流程中,为了快速验证API接口有效性,团队成员经常转向直接执行cURL命令的方法。这种做法不仅节省时间,而且促进了团队效率的提升。对于使用Windows系统的用户来说,这里有一套详细...

使用 Golang net/http 包:基础入门与实战

简介Go的net/http包是构建HTTP服务的核心库,功能强大且易于使用。它提供了基本的HTTP客户端和服务端支持,可以快速构建RESTAPI、Web应用等服务。本文将介绍ne...

#小白接口# 使用云函数,人人都能编写和发布自己的API接口

你只需编写简单的云函数,就可以实现自己的业务逻辑,发布后就可以生成自己的接口给客户端调用。果创云支持对云函数进行在线接口编程,进入开放平台我的接口-在线接口编程,设计一个新接口,设计和配置好接口参...

极度精神分裂:我家没有墙面开关,但我虚拟出来了一系列开关

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:iN在之前和大家说过,在iN的家里是没有墙面开关的。...

window使用curl命令的注意事项 curl命令用法

cmd-使用curl命令的注意点前言最近在cmd中使用curl命令来测试restapi,发现有不少问题,这里记录一下。在cmd中使用curl命令的注意事项json不能由单引号包括起来json...

Linux 系统curl命令使用详解 linuxctrl

curl是一个强大的命令行工具,用于在Linux系统中进行数据传输。它支持多种协议,包括HTTP、HTTPS、FTP等,用于下载或上传数据,执行Web请求等。curl命令的常见用法和解...

Tornado 入门:初学者指南 tornados

Tornado是一个功能强大的PythonWeb框架和异步网络库。它最初是为了处理实时Web服务中的数千个同时连接而开发的。它独特的Web服务器和框架功能组合使其成为开发高性能Web...

PHP Curl的简单使用 php curl formdata

本文写给刚入PHP坑不久的新手们,作为工具文档,方便用时查阅。CURL是一个非常强大的开源库,它支持很多种协议,例如,HTTP、HTTPS、FTP、TELENT等。日常开发中,我们经常会需要用到cur...

Rust 服务器、服务和应用程序:7 Rust 中的服务器端 Web 应用简介

本章涵盖使用Actix提供静态网页...

我给 Apache 顶级项目提了个 Bug apache顶级项目有哪些

这篇文章记录了给Apache顶级项目-分库分表中间件ShardingSphere提交Bug的历程。说实话,这是一次比较曲折的Bug跟踪之旅。10月28日,我们在GitHub上提...

linux文件下载、服务器交互(curl)

基础环境curl命令描述...

curl简单使用 curl sh

1.curl--help#查看关键字2.curl-A“(添加user-agent<name>SendUser-Agent<name>toserver)”...

常用linux命令:curl 常用linux命令大全

//获取网页内容//不加任何选项使用curl时,默认会发送GET请求来获取内容到标准输出$curlhttp://www.baidu.com//输出<!DOCTYPEh...

三十七,Web渗透提高班之hack the box在线靶场注册及入门知识

一.注册hacktheboxHackTheBox是一个在线平台,允许测试您的渗透技能和代码,并与其他类似兴趣的成员交流想法和方法。它包含一些不断更新的挑战,并且模拟真实场景,其风格更倾向于CT...