分布式事务实战

如果你说:

Seata AT模式、TCC、Saga、XA...

你懂理论。

但如果问:

线上怎么做分布式事务?

那答案往往完全不一样。

先说结论

现在互联网Java项目里,真正大量使用的是:

第一梯队

✅ 最终一致性(消息队列)

本地事务 + MQ
例如:

订单服务

创建订单

发送MQ

库存服务扣库存

积分服务加积分

优惠券服务核销

阿里、京东、美团、字节大量业务都是这个思路。

第二梯队

✅ Seata AT

适合:

订单

库存

账户

多个数据库同时更新。

很多中小公司直接上。

第三梯队

✅ TCC

适合:

支付

转账

金融

要求极高一致性。

开发成本很高。

实际案例1:订单+库存

假设:

order-service

stock-service

用户下单:

java 复制代码
createOrder()

同时:

java 复制代码
deductStock()

很多新人写:

java 复制代码
@Transactional
public void createOrder() {
    orderMapper.insert();
    stockFeign.deduct();
}

错。

因为:

@Transactional

只能管当前数据库

Feign调用根本不受控制。

生产最常见写法

订单服务:

java 复制代码
@Transactional
public void createOrder(Order order){
    orderMapper.insert(order);
    kafkaTemplate.send(
            "order_create",
            order.getId()
    );
}

保证:

订单成功

MQ一定发送

库存服务监听:

java 复制代码
@KafkaListener(topics = "order_create")
public void consume(Long orderId){
    stockMapper.deduct(orderId);
}

如果库存失败:

重试

补偿

人工介入

最终一致。

实际案例2:可靠消息最终一致性

这是目前最普遍方案。

订单库:

sql 复制代码
order_info

再建:

sql 复制代码
mq_message

业务事务:

java 复制代码
@Transactional
public void createOrder(){
    orderMapper.insert();
    messageMapper.insert(
       "ORDER_CREATE"
    );
}

同一个事务。

提交成功:

订单有了

消息也有了

后台线程扫描:

java 复制代码
@Scheduled
public void sendMessage(){
    List<Message> list =
        messageMapper.queryPending();
    for(Message m:list){
        kafka.send(m);
        updateSuccess();
    }
}

这就是:

事务消息

可靠消息

最终一致性

很多公司都这么干。

实际案例3:Seata

如果公司已经接入Seata。

代码反而简单。

订单服务:

java 复制代码
@GlobalTransactional
public void createOrder(){
    orderMapper.insert();
    stockFeign.deduct();
    accountFeign.reduce();
}

库存:

java 复制代码
@Transactional
public void deduct(){
    stockMapper.update();
}

账户:

java 复制代码
@Transactional
public void reduce(){
    accountMapper.update();
}

如果账户失败:

回滚订单

回滚库存

自动完成。

线上配置:

XML 复制代码
seata:
  enabled: true

再注册:

TC

TM

RM

即可。

为什么很多大厂不用Seata

因为:

性能

AT模式会生成:

undo_log

每次:

前镜像

后镜像

都要记录。

高并发压力大。

锁冲突

会有:

全局锁

例如:

库存1000

1万人抢。

容易卡。

所以:

高并发业务

=

MQ最终一致

更常见。

直接回答:

生产环境最常见的是基于MQ的最终一致性方案,例如Kafka、RocketMQ。业务先提交本地事务,再发送事务消息,由下游服务异步消费实现数据同步。对于强一致性要求不高的业务,这是主流方案。对于订单、库存、账户等需要强一致性的场景,中小公司常用Seata AT模式,大型金融场景会使用TCC。

相关推荐
风吹夏回8 天前
RabbitMQ 核心术语 + Python pika 方法完整讲解
分布式·python·rabbitmq
风吹夏回8 天前
RabbitMQ 三种模式入门:HelloWorld、WorkQueue、PubSub
分布式·rabbitmq·ruby
霸道流氓气质9 天前
分布式追踪与 RequestId 传播完全指南
分布式
cheems95279 天前
[RabbitMQ高级特性] 消息确认机制:从 Ready / Unacked 到 basicAck、basicReject、basicNack 的底层拆解
分布式·rabbitmq·ruby
枫华落尽9 天前
【Hadoop01-完全分布式运行模式】
分布式
隔壁阿布都9 天前
ShedLock 分布式定时任务锁框架介绍
spring boot·分布式
文艺倾年9 天前
【强化学习】数学推导专题,20W字总结(十五)
人工智能·分布式·大模型·强化学习·vibecoding
ACP广源盛139246256739 天前
GSV9001S@ACP#1080P 级视频处理芯片,物理 AI 普及终端的高性价比选择
大数据·人工智能·分布式·嵌入式硬件·spark
guslegend9 天前
第1章:初始Kafka
分布式·kafka
ACP广源盛139246256739 天前
GSV5600@ACP#多接口协议转换芯片,物理 AI 便携终端的互联核心
大数据·人工智能·分布式·嵌入式硬件·spark