Seata 全局事务管理:如何配置和使用 Seata 的事务管理功能?

开发 开发工具
Seata 作为一个分布式事务管理工具,为微服务架构提供了一种高效、简单的事务管理解决方案。通过配置 Seata 的全局事务和分支事务,并结合 Spring Boot 或 Spring Cloud,可以帮助开发人员轻松管理跨服务和跨数据库的事务一致性。

Seata 是一个开源的分布式事务解决方案,旨在为微服务架构中的分布式事务提供统一的事务管理功能。它通过全局事务和分支事务的概念,解决了跨服务和跨数据库的一致性问题。接下来我们将深入探讨如何配置和使用 Seata 的事务管理功能,重点介绍全局事务 ID、分支事务、事务状态等核心概念,并通过多个代码示例展示如何在 Spring Boot 和 Spring Cloud 中使用 Seata。

1、核心概念

在 Seata 中,分布式事务被分为两大类:

1、全局事务(Global Transaction) 全局事务是一个跨多个微服务或系统的事务,它由一个全局事务 ID 唯一标识。全局事务可以包括多个分支事务,它的目标是确保多个分支事务在最终提交或回滚时保持一致性。

2、分支事务(Branch Transaction) 分支事务是全局事务的一部分,通常对应于具体的操作,如调用远程服务、访问数据库等。分支事务通常是短时间的,并由具体的资源管理器(如数据库或消息队列)负责处理。

3、事务状态(Transaction Status) Seata 中的事务状态包括:

  • Begin:事务开始
  • Commit:事务提交
  • Rollback:事务回滚

4、Seata 的角色

  • TC(Transaction Coordinator):负责全局事务的协调
  • RM(Resource Manager):管理和操作分支事务,通常是数据库、消息队列等
  • TM(Transaction Manager):负责发起全局事务,通常集成在服务代码中

2、如何配置 Seata 和使用全局事务

2.1、添加 Seata 依赖

在 Spring Boot 项目中,可以通过以下 Maven 依赖来引入 Seata 相关依赖:

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

2.2、Seata 配置

Seata 需要一个配置中心来存储全局事务的状态。最常见的配置是通过 Nacos 或 Zookeeper 实现。下面是一个典型的 application.yml 配置示例:

server:
  port: 8080

spring:
  application:
    name: seata-demo

seata:
  tx-service-group: my_test_tx_group # 设置全局事务组名
  config:
    type: nacos
    nacos:
      server-addr: localhost:8848
      namespace: public
      group: SEATA_GROUP
  transport:
    type: TCP
    server: 127.0.0.1:8091

2.3、配置 Seata 服务端

Seata 服务端需要配置数据库或其他存储系统来管理事务。以 Nacos 为例,配置项如下:

transport:
  type: TCP
  server: 127.0.0.1:8091

store:
  mode: db
  db:
    datasource:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/seata
      user: root
      password: root

2.4、启用 Seata 全局事务

在 Spring Boot 中,你可以使用 @GlobalTransactional 注解来启用全局事务。例如,下面的代码展示了一个简单的全局事务管理:

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

@Service
public class OrderService {

    @GlobalTransactional
    public void createOrder() {
        // 模拟创建订单操作
        System.out.println("Order Created");
    }
}

3、使用 Seata API 提交、回滚事务

Seata 提供了多种 API 来操作全局事务,例如提交事务、回滚事务等。以下是如何使用 Seata API 来管理事务。

3.1、事务开始

当你调用 @GlobalTransactional 注解的服务时,Seata 会自动启动全局事务并生成一个全局事务 ID。在代码中,你不需要手动创建事务,Seata 会自动管理它。

3.2、提交事务

如果所有的分支事务都成功执行,Seata 会尝试提交全局事务。你可以通过调用 GlobalTransactionContext 来手动提交事务。

import io.seata.core.context.GlobalTransactionContext;
import io.seata.tm.api.GlobalTransaction;

public class OrderService {

    public void commitTransaction() {
        GlobalTransaction globalTransaction = GlobalTransactionContext.getCurrentOrCreate();
        globalTransaction.commit();
    }
}

3.3、回滚事务

如果出现任何错误,或者你需要回滚整个事务,可以调用 GlobalTransactionContext 提供的 rollback() 方法来回滚全局事务。

public void rollbackTransaction() {
    GlobalTransaction globalTransaction = GlobalTransactionContext.getCurrentOrCreate();
    globalTransaction.rollback();
}

4、分支事务的处理

4.1、分支事务的注册

在 Seata 中,分支事务是由 Resource Manager (RM) 进行管理的。一个分支事务通常会在服务调用或数据库操作之前进行注册。你可以通过 Seata 提供的 API 注册分支事务。

假设我们在做一个订单和支付的操作,订单服务和支付服务是两个分支事务。

import io.seata.rm.datasource.DataSourceProxy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class OrderService {

    @Autowired
    private DataSourceProxy dataSource;

    public void createOrderAndPay() {
        // 先创建订单
        createOrder();
        
        // 然后支付
        makePayment();
    }

    private void createOrder() {
        // 订单创建逻辑
        System.out.println("Creating Order");
    }

    private void makePayment() {
        // 支付逻辑
        System.out.println("Making Payment");
    }
}

4.2、分支事务的提交和回滚

分支事务的提交和回滚通常是由 RM 管理器根据全局事务的状态进行的。如果所有分支事务都成功,Seata 会提交这些事务;如果某个分支事务失败,Seata 会回滚所有相关事务。

5、Seata 和 Spring Cloud 整合

如果你在使用 Spring Cloud 微服务框架,Seata 提供了与 Spring Cloud 的集成支持。以下是如何配置 Spring Cloud 和 Seata。

5.1、Spring Cloud 集成 Seata

首先,在 Spring Cloud 的 application.yml 中添加 Seata 的配置:

seata:
  tx-service-group: my_test_tx_group
  config:
    type: nacos
    nacos:
      server-addr: localhost:8848
      namespace: public
      group: SEATA_GROUP
  transport:
    type: TCP
    server: 127.0.0.1:8091

然后,像 Spring Boot 一样,通过 @GlobalTransactional 注解来启动全局事务。

5.2、跨服务的全局事务管理

在微服务架构中,你可能会有多个服务进行分布式事务的管理。例如,订单服务和支付服务的事务可以通过 Seata 进行跨服务的全局事务管理。你只需要确保每个微服务都启用了 Seata 并配置了正确的事务组名。

import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrderController {

    @Autowired
    private OrderService orderService;

    @Autowired
    private PaymentService paymentService;

    @GlobalTransactional
    @RequestMapping("/createOrder")
    public String createOrder() {
        // 创建订单并支付
        orderService.createOrder();
        paymentService.makePayment();
        return "Order Created and Payment Made";
    }
}

6、总结

Seata 作为一个分布式事务管理工具,为微服务架构提供了一种高效、简单的事务管理解决方案。通过配置 Seata 的全局事务和分支事务,并结合 Spring Boot 或 Spring Cloud,可以帮助开发人员轻松管理跨服务和跨数据库的事务一致性。

关键点回顾:

  • 全局事务 和 分支事务 是 Seata 事务模型的核心。
  • @GlobalTransactional 注解可以自动启动全局事务。
  • 事务的提交和回滚通过 Seata API 进行管理。
  • Seata 可以与 Spring Boot 和 Spring Cloud 平台进行无缝集成。

通过本文的示例代码,你可以在实际项目中轻松实现 Seata 的分布式事务管理,并确保多个微服务之间的事务一致性。

责任编辑:武晓燕 来源: 架构师秋天
相关推荐

2023-10-08 08:28:10

Spring事务管理

2009-06-17 14:57:11

Spring事务管理

2009-06-03 10:20:11

Hibernate事务管理配置

2009-06-30 16:57:42

Spring事务管理

2009-06-08 17:56:00

SpringJDBC事务

2023-03-27 10:40:09

2022-08-04 08:46:16

单体架构微服务事务管理

2009-09-25 12:59:53

Hibernate事务

2014-08-25 09:12:47

Spring事务管理

2009-09-29 09:44:52

Hibernate事务

2009-09-23 17:48:00

Hibernate事务

2009-07-17 14:03:34

ibatis DAO事务管理

2010-03-29 13:34:15

ibmdwSpring

2010-03-23 08:46:40

Spring

2009-02-11 13:08:29

事务提交事务管理Spring

2009-06-17 14:43:47

Spring框架Spring事务管理

2009-02-11 11:14:31

事务管理事务开始Spring

2010-10-22 11:47:30

sql server存

2010-04-21 08:50:08

2024-06-05 06:51:11

点赞
收藏

51CTO技术栈公众号