【JAVA】Java微服务—分布式事务框架Seata

Seata 是 分布式事务框架。

Nacos 解决"服务之间怎么找到彼此";

Seata 解决"多个服务一起操作数据库时,怎么保证要么都成功,要么都失败"。


1. 为什么需要 Seata?

假设你现在有两个微服务:

复制代码
order 服务:负责创建订单
stock 服务:负责扣减库存

用户下单时,流程可能是:

复制代码
1. order 服务创建订单
2. stock 服务扣减库存

正常情况下:

复制代码
订单创建成功
库存扣减成功

这没问题。

但是如果出现这种情况:

复制代码
订单创建成功
库存扣减失败

那就麻烦了。

因为数据库里会变成:

复制代码
订单表里有订单
库存表没有扣减

这就叫 数据不一致。


2. 单体项目里事务很好解决

如果是单体项目,订单表和库存表都在一个服务里,可以直接用:

复制代码
@Transactional
public void createOrder() {
    // 创建订单
    // 扣减库存
}

如果中间出错,Spring 可以自动回滚。

也就是:

复制代码
要么订单和库存都成功
要么订单和库存都失败

3. 微服务项目里事务变复杂了

但是微服务中是这样:

复制代码
order 服务有自己的数据库
stock 服务有自己的数据库

结构类似:

复制代码
order 服务  →  order_db
stock 服务  →  stock_db

这时候 @Transactional 只能管住当前服务自己的数据库。

也就是说:

复制代码
@Transactional
public void addOrder() {
    // 这里只能保证 order_db 的事务
}

它管不了 stock 服务 的数据库。

所以问题来了:

复制代码
order 服务成功了
stock 服务失败了
谁来统一回滚?

这就是 Seata 要解决的问题。


4. Seata 是干什么的?

Seata 的作用是:

管理多个微服务之间的分布式事务。

比如下单流程:

复制代码
order 服务创建订单
stock 服务扣减库存
account 服务扣减余额

Seata 可以让它们变成一个整体事务:

复制代码
全部成功 → 提交
有一个失败 → 全部回滚

5. 用你的项目理解 Seata

你截图里有:

复制代码
order
stock

如果没有 Seata:

复制代码
用户请求 /order/add
    ↓
order 创建订单成功
    ↓
order 调用 stock 扣库存
    ↓
stock 扣库存失败
    ↓
结果:订单已经创建,但库存没扣

这就是不一致。

如果有 Seata:

复制代码
用户请求 /order/add
    ↓
order 创建订单
    ↓
stock 扣库存
    ↓
如果 stock 失败
    ↓
Seata 通知 order 回滚
    ↓
订单也撤销

最终结果:

复制代码
订单没有创建
库存也没有变化

数据保持一致。


6. Seata 的核心角色

Seata 里面有三个重要角色。

TC:事务协调者

TC 全称是:

复制代码
Transaction Coordinator

它是 Seata 的服务端。

作用是:

复制代码
统一管理整个分布式事务
决定最后是提交还是回滚

你可以理解成:

TC 是总指挥。


TM:事务管理器

TM 全称是:

复制代码
Transaction Manager

一般在发起事务的服务里。

比如 order 服务是整个下单流程的入口,那么 order 服务通常就是 TM。

它负责:

复制代码
开启全局事务
提交全局事务
回滚全局事务

你可以理解成:

TM 是这次事务的发起人。


RM:资源管理器

RM 全称是:

复制代码
Resource Manager

每个操作数据库的服务都可以看作 RM。

比如:

复制代码
order 服务操作 order_db
stock 服务操作 stock_db
account 服务操作 account_db

它们都是 RM。

RM 负责:

复制代码
执行本地数据库操作
向 TC 汇报状态
根据 TC 指令提交或回滚

你可以理解成:

RM 是具体干活的人。


7. Seata 的执行流程

以下单为例:

复制代码
1. order 服务开启全局事务
2. order 服务创建订单
3. order 服务调用 stock 服务
4. stock 服务扣减库存
5. 如果都成功,Seata 统一提交
6. 如果有失败,Seata 统一回滚

结构可以这样看:

复制代码
用户
 ↓
order 服务:TM + RM
 ↓
stock 服务:RM
 ↓
Seata Server:TC

8. 代码里一般怎么用?

在入口方法上加:

复制代码
@GlobalTransactional

例如:

复制代码
@GlobalTransactional
public String createOrder() {
    // 1. 创建订单

    // 2. 调用库存服务扣库存

    // 3. 如果中间出错,Seata 负责全局回滚

    return "下单成功";
}

注意区别:

复制代码
@Transactional:本地事务,只管当前服务自己的数据库
@GlobalTransactional:全局事务,可以管多个微服务

9. Seata 和 Nacos 是什么关系?

它们不是一个东西。

组件 作用
Nacos 服务注册、服务发现、配置中心
Seata 分布式事务
Sentinel 限流、熔断、降级
Gateway 网关
OpenFeign / RestTemplate 服务调用

在 Spring Cloud Alibaba 体系里,它们经常一起出现。

你可以这样理解:

复制代码
Nacos:帮服务互相找到
Seata:帮多个服务保持数据一致

10. 一句话总结

Seata 是用来解决微服务分布式事务问题的。

在你的 order + stock 项目里,它主要解决这个问题:

下单时,订单创建成功但扣库存失败怎么办?

有了 Seata,可以做到:

复制代码
订单创建和库存扣减,要么都成功,要么都失败。
相关推荐
智能直播5 小时前
RK3528 V4L2 框架 UVC 接口自动获取 H.264 / MJPEG / YUYV 格式:从内核采集到硬解分发
java·网络·实时音视频·视频编解码·h.264
171320330计算机毕设编程5 小时前
计算机毕业设计 基于YOLO改进算法的车辆特征识别系统设计与实现--lw
java·大数据·python·sql·算法
Web极客码5 小时前
Python Ollama 本地 Agent 入门与订单查询实践
开发语言·jvm·python
badhope5 小时前
Spring AI Alibaba停更:Java程序员的信任,还能被辜负几次?
java·spring
const_qiu5 小时前
第一章 1.1-1.2:基础模型调用与 TypeScript 入门 —— Java 开发者的视角
java·javascript·typescript
Wang's Blog5 小时前
Java 项目实战: 交友项目 - Dubbo 负载均衡策略与实战验证
java·dubbo·交友
SL_staff5 小时前
销售知识库7天落地实践:面向业务侧的零代码嵌入方案
java·开源·产品
kimnoic5 小时前
PHP 8.2的DNF类型怎么用才规范
开发语言·php
GreatSQL社区6 小时前
主从复制SQL线程中断——字符集砸出的坑
java·数据库·算法
_Evan_Yao6 小时前
前后端联调怎么排查问题?从 Network 到后端日志,一步步定位错误
开发语言·后端·团队开发·需求分析