JAVA:探索分布式事务 Seata 的技术指南

admin
7
2025-07-25

1、简述

随着互联网应用的不断发展,分布式系统已经成为构建大规模应用的标配。然而,分布式系统中的事务管理一直是一个具有挑战性的问题。为了解决这一问题,Seata(Simple Extensible Autonomous Transaction Architecture)应运而生,成为分布式事务管理的一种领先解决方案。本文将深入探讨 Seata 在分布式事务应用中的技术原理和实践经验。

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

文档地址http://seata.io/zh-cn/docs/overview/what-is-seata.html

image-exdf.png


2、核心

Seata 主要包含三个核心组件:Transaction Coordinator(TC)、Transaction Manager(TM)和 Resource Manager(RM)。这三个组件协同工作,确保分布式事务的一致性。

🔹 Transaction Coordinator (TC): 负责协调全局事务的进行,收集各个参与者的事务执行结果,并最终决定事务是提交还是回滚。

🔹 Transaction Manager (TM ): 用于管理全局和分支事务的生命周期,与 TC 交互以确保全局事务的正确执行。

🔹 Resource Manager (RM): 管理分支事务的资源,负责事务的注册、提交和回滚等操作。

image-cifw.png


3、实践

首先,我们需要搭建 Seata 环境。可以通过官方文档获取最新的 Seata 发布包,然后按照文档说明进行部署。确保 TC、TM 和 RM 正常运行,并与业务系统成功集成。

3.1 创建UNDO_LOG 表

基于支持本地 ACID 事务的关系型数据库。Java 应用,通过 JDBC 访问数据库。即具有InnoDB引擎的MySQL。
日志回滚记录表

CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  `ext` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

3.2 添加pom.xml引用

<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

通过Maven包查看当前导入seata服务器版本
image-tszk.png
https://github.com/seata/seata/releases下载指定版本。

3.3 Seata配置

调整当前注册中心和配置存放的地方:
🔹registry.conf :注册中心配置,直接将服务配置在nacos
🔹file.conf:配置存放的地方。

image-ypfe.png

3.4 调整Seata微服务数据源使用代理

@Configuration
public class MySeataConfig {

    @Autowired
    DataSourceProperties dataSourceProperties;

    @Bean
    public DataSource dataSource(DataSourceProperties properties){
        HikariDataSource dataSource = properties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
        if(StringUtils.hasText(properties.getName())){
            dataSource.setPoolName(properties.getName());
        }
        return new DataSourceProxy(dataSource);
    }
}

将当前的注册配置和文件配置拷贝到当前项目底下。file.conf 的 service.vgroup_mapping 配置必须和spring.application.name一致在 org.springframework.cloud:spring-cloud-starter-alibaba-seata的org.springframework.cloud.alibaba.seata.GlobalTransactionAutoConfiguration类中,默认会使用 ${spring.application.name}-fescar-service-group作为服务名注册到 Seata Server上,如果和file.conf中的配置不一致,会提示 no available server to connect错误

也可以通过配置 spring.cloud.alibaba.seata.tx-service-group修改后缀,但是必须和file.conf中的配置保持一致

image-rgqr.png

3.5 开启远程事务

在业务代码中,通过 Seata 提供的事务编程模型来管理事务。通过注解或 API 的方式标识业务方法的边界,使其成为一个事务单元。在事务方法中,Seata 会通过 TC、TM 和 RM 协同工作,确保事务的正确执行。
🔹给大事务添加全局的事务管理@GlobalTransactional
🔹给小事务添加@Transactional

@GlobalTransactional
@Transactional
@Override
public void addStock(Long skuId, Long wareId, Integer skuNum) {}

4、总结

通过本文的介绍,我们深入了解了 Seata 的核心概念和应用实践。在构建分布式系统时,选择适当的事务管理工具对于确保系统的一致性至关重要。Seata 凭借其简单、高效、可扩展的特性,成为业界分布式事务管理的首选之一。在实际应用中,合理配置和良好的编程实践是保障 Seata 正常运行的关键。希望本文能够为读者在分布式事务管理方面的学习和实践提供一些有益的指导。

动物装饰