本地事务与分布式事务

📘 事务体系总结:本地事务、本地事务与分布式事务详解

🧩 1. 什么是事务(Transaction)?

事务是一组数据库操作的逻辑单元,这些操作要么全部成功、要么全部失败,保证数据的完整性与一致性。

事务具备数据库的 ACID 特性:

  • A(原子性):全部执行或全部不执行
  • C(一致性):事务前后数据总量一致
  • I(隔离性):不同事务之间互不干扰
  • D(持久性):提交后的数据永久保存

🟩 2. 本地事务(Local Transaction)

✔ 定义

本地事务指 单个服务操作单个数据库 时,由数据库自己保证 ACID 特性的事务。

⭐ 本地事务 = @Transactional 的控制范围

它保证当前服务的所有 SQL 要么全部成功,要么全部回滚。

✔ 使用示例(Spring Boot)

复制代码
@Transactional
public void createOrder() {
    insertOrder();
    insertOrderItem();
    updateStock();
}

✔ 特点

  • 高性能
  • 简单易用
  • 数据库原生支持
  • Spring Boot 直接支持 @Transactional

✔ 限制

  • 无法跨服务保证一致性
  • 无法跨多个数据库进行事务管理

🟦 3. 为什么需要分布式事务?

在微服务架构中,一个业务流程往往涉及多个服务:

复制代码
订单服务 → 操作订单库  
库存服务 → 操作库存库  
支付服务 → 操作支付库

如果你在订单服务写:

复制代码
@Transactional
public void placeOrder() {
    saveOrder();
    callStockService(); // 扣库存
}

即使这个方法回滚,库存服务已经扣了库存,不会自动回滚,因为:

本地事务无法影响其他服务的数据库。

因此在微服务中需要更高级别的------分布式事务


🟥 4. 分布式事务(Distributed Transaction)

分布式事务是指保证跨多个服务、多个数据库之间的数据一致性。

常见的分布式事务方案:


4.1 XA(两阶段提交,2PC)

流程:

  1. Prepare:各数据库锁住资源
  2. Commit:全部通过后正式提交

优点:

  • 强一致性

缺点:

  • 性能差
  • 数据库锁时间长
  • 互联网项目极少使用

4.2 TCC(Try / Confirm / Cancel)

三步执行:

  1. Try:检查资源、预留资源(如冻结资金)
  2. Confirm:正式提交
  3. Cancel:出错后回滚

优点:

  • 更灵活
  • 可实现强一致性

缺点:

  • 开发成本高,需要写三套业务逻辑

代表实现:Seata TCC


4.3 AT 模式(Seata 最常用)

  • 自动记录 Undo Log
  • 自动回滚
  • 对开发无侵入

适合大多数互联网业务。


4.4 Saga(长事务)

  • 每个步骤是一个本地事务
  • 出错靠补偿事务逆向回滚

更加适合长链路、跨系统调用。


🟨 5. 最终一致性事务(高并发场景最常用)

最终一致性事务允许数据短时间不一致,通过异步消息最终达成一致。

常见实现:

  • RocketMQ 事务消息
  • Kafka 事务消息
  • 本地消息表 + MQ

适合高并发业务:

如:

  • 下单成功 → 发送消息 → 库存服务扣减库存
  • 如果库存扣失败,服务会自动进行补偿或重试

⭐ CAP 原理下的最佳折中方案(牺牲强一致性,获得可用性和高性能)


🟨 6. 三类事务对比

事务类型 应用场景 一致性 性能 开发难度
本地事务 单服务单数据库 强一致性 ⭐⭐⭐⭐⭐
分布式事务 多服务多数据库 强一致性(视方案而定) ⭐~⭐⭐ ⭐⭐⭐⭐⭐
最终一致性 高并发异步业务 最终一致 ⭐⭐⭐⭐⭐ ⭐⭐

🟦 7. @Transactional 的核心总结

场景 @Transactional 是否有效 说明
单体项目 ✔ 完全可用 本地事务
单服务 → 单数据库 ✔ 可用 微服务也可以
多服务 → 多数据库 ❌ 无效 不能跨服务事务
分布式事务 ❌ 自己不够 需要 Seata / TCC / XA 等

🟢 8. 总结一句话

本地事务保证"当前服务 + 当前数据库"的一致性,分布式事务保证跨服务一致性,最终一致性则保证大规模系统的异步一致性。
@Transactional = 本地事务,不等于分布式事务。

相关推荐
小北方城市网1 天前
微服务架构设计实战指南:从拆分到落地,构建高可用分布式系统
java·运维·数据库·分布式·python·微服务
heartbeat..1 天前
Spring 全局上下文实现指南:单机→异步→分布式
java·分布式·spring·context
上海锟联科技1 天前
相干衰弱在分布式光纤声波传感(DAS)系统中的影响与抑制应用
分布式·分布式光纤传感·光频域反射·das
魂之木1 天前
【零基础教程】基于Docker的RabbitMQ部署方案
分布式·docker·微服务·rabbitmq
oMcLin1 天前
如何在 RHEL 7 上通过配置 Apache Kafka 集群的分区机制,提升消息传递系统的吞吐量与数据流处理能力?
分布式·kafka·apache
红队it1 天前
【Spark+Hadoop】基于spark+hadoop游戏评论数据分析可视化大屏(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅
大数据·hadoop·分布式·算法·游戏·数据分析·spark
前端世界1 天前
鸿蒙系统中的分布式任务依赖是如何处理的?原理、方案与实践
分布式·华为·harmonyos
小雨下雨的雨1 天前
Flutter跨平台开发实战: 鸿蒙与循环交互艺术:分布式联动与多端状态同步
分布式·flutter·华为·交互·harmonyos·鸿蒙系统
DeepFlow 零侵扰全栈可观测1 天前
DeepFlow 实践:利用 eBPF 实现覆盖从网关到数据库的全栈分布式追踪
网络·分布式·云原生·云计算
俊哥大数据1 天前
【项目9】 基于Spark网站流量日志大数据实时分析系统
大数据·分布式·spark