Seata 分布式事务安装配置集成实战
以下是 Seata 分布式事务安装配置集成实战 的完整示例,基于 Spring Boot 和 Nacos 注册中心,涵盖服务端部署、客户端集成、业务场景演示等步骤:
一、Seata 服务端(TC)部署
1. 下载 Seata 服务端
- 从 GitHub 发布页 下载
seata-server-1.4.0.zip
(或稳定版本),解压至/opt/seata
。
2. 配置 Seata 服务端
-
修改
conf/file.conf
:store {mode = "db" # 使用数据库模式存储事务日志db {datasource = "druid"dbType = "mysql"driverClassName = "com.mysql.jdbc.Driver" # MySQL 8以上需改为 com.mysql.cj.jdbc.Driverurl = "jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true"user = "hydra"password = "123456"minConn = 5maxConn = 100globalTable = "global_table"branchTable = "branch_table"lockTable = "lock_table"} }
-
修改
conf/registry.conf
(以 Nacos 为例):registry {type = "nacos"nacos {serverAddr = "127.0.0.1:8848"namespace = "202274f4-218e-42bf-9251-e996df6340f8" # 可自定义group = "SEATA_GROUP"username = "nacos"password = "nacos"} } config {type = "nacos"nacos {serverAddr = "127.0.0.1:8848"namespace = "202274f4-218e-42bf-9251-e996df6340f8"group = "SEATA_GROUP"} }
3. 初始化数据库
- 创建数据库
seata
,执行script/server/db/mysql.sql
建表脚本(包含global_table
、branch_table
、lock_table
)。
4. 启动 Seata 服务端
cd /opt/seata/bin
./seata-server.sh -p 8091 -h 127.0.0.1
二、Spring Boot 客户端集成
1. 创建 Spring Boot 项目
- 使用
Spring Initializr
创建项目,添加依赖:<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><version>2.2.1.RELEASE</version></dependency> </dependencies>
2. 配置客户端
application.yml
:spring:datasource:url: jdbc:mysql://localhost:3306/testdb?useUnicode=trueusername: rootpassword: root seata:tx-service-group: my_tx_group # 与服务端 vgroupMapping 对应service:vgroup-mapping:my_tx_group: defaultregistry:type: nacosnacos:server-addr: 127.0.0.1:8848group: SEATA_GROUPnamespace: 202274f4-218e-42bf-9251-e996df6340f8
3. 业务代码示例
-
实体类与 Repository(以订单服务为例):
@Entity public class Order {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String productName;private Integer quantity;// Getters and Setters }public interface OrderRepository extends JpaRepository<Order, Long> {}
-
全局事务方法:
@Service public class OrderService {@Autowiredprivate OrderRepository orderRepository;@GlobalTransactional(rollbackFor = Exception.class)public void createOrder(String productName, int quantity) {// 模拟业务逻辑Order order = new Order();order.setProductName(productName);order.setQuantity(quantity);orderRepository.save(order);// 模拟调用其他服务(如库存服务)// 通过 Feign 或 RestTemplate 调用} }
三、分布式事务测试
1. 启动服务
- 启动 Nacos 服务器(
127.0.0.1:8848
)。 - 启动 Seata 服务端(
127.0.0.1:8091
)。 - 启动 Spring Boot 应用。
2. 触发分布式事务
- 通过 Postman 或浏览器调用
createOrder
接口,观察:- 成功提交:
global_table
和branch_table
记录事务状态,业务数据持久化。 - 人工回滚:在事务未提交时中断,验证数据是否回滚。
- 成功提交:
3. 验证事务一致性
- 检查数据库
testdb
和seata
中的数据,确保全局事务 ID(XID)关联的分支事务状态一致。
四、常见问题与解决方案
-
无法连接 Seata 服务端:
- 检查
registry.conf
中 Nacos 地址和命名空间是否一致。 - 确保 Seata 服务端已启动并注册到 Nacos。
- 检查
-
事务组名不匹配:
- 客户端
tx-service-group
需与服务端vgroupMapping
配置对应(如my_tx_group
→default
)。
- 客户端
-
依赖冲突:
- 排除旧版 Seata 依赖,优先使用
spring-cloud-starter-alibaba-seata
。
- 排除旧版 Seata 依赖,优先使用
五、总结
- 核心流程:部署 Seata 服务端 → 配置注册中心与数据库 → 集成 Spring Boot 客户端 → 定义全局事务方法。
- 关键点:
- 使用 Nacos 统一管理配置和注册。
- 确保事务组名、数据源配置、注册中心信息一致。
- AT 模式下无需侵入业务代码,自动生成补偿逻辑。
通过以上步骤,可实现基于 Seata 的分布式事务完整示例,适用于微服务架构下的订单、库存等场景。