认识分布式事务

简介: 本文以“下单扣减库存”为例,对比单体与微服务架构下的事务处理差异,揭示分布式事务的挑战。在微服务场景中,跨服务调用依赖网络,本地事务无法保证全局一致性,易因网络问题导致数据不一致。文章进一步分析典型及非典型分布式事务场景,指出其根本原因在于多数据库或远程调用的协作复杂性。

下边为了简化分析过程 我们仍然以下单扣减库存为例说明:

在单体架构下实现下单减库存,如下图:

用户请求订单服务,订单服务请求数据库完成创建订单扣减库存,通过本地事务实现,代码如下:

begin transaction; 
//1.本地数据库操作:创建订单
//2.本地数据库操作:减去库存 
commit transation;

如果是在微服务架构下,如下图:

用户请求订单服务下单,订单服务请求库存服务扣减库存。

此时代码变为下边这样:

begin transaction; 
//1.本地数据库操作:创建订单
//2.远程调用:减去库存 
commit transation;

设想: 当远程调用扣减库存成功了,由于网络问题远程调用并没有返回,此时本地事务提交失败就回滚了创建订单的操作,此时订单没有创建成功而库存却扣减了,最终就导致了下单扣减库存整个事务的数据不一致。

因此在分布式架构下,基于数据库的事务控制无法满足要求,下单操作是一次本地事务,扣减库存是一次本地事务,两次本地事务组成一个完整的事务即下单扣减库存,数据库的本地事务只能控制一次本地事务即下单操作控制下单的本地事务,扣减库存操作控制扣减库存的本地事务,无法保证下单和扣减库存整体事务的原子性和一致性。

造成分布式事务无法控制的根本原因是不同业务的数据通常不在一个数据库中或者不在一个系统中,一次事务需要由多个服务或多个系统远程调用协作完成,远程协作依赖网络,由于网络问题会导致整体事务不能正常完成。

分布式事务的典型场景是:业务的数据分布在多个数据库,一次事务操作需要跨多个数据库去完成,

需要由多个服务远程调用协作去完成,远程调用依赖网络,由于网络问题会导致整体事务不能正常完成。

如下图所示:

还有非典型的分布式事务场景也需要了解下。

1)单服务请求多数据库完成一次事务

下图中虽然没有跨服务远程调用但一次事务请求两个不同的数据库也属于分布式事务的场景,创建订单会和订单数据库创建连接通过一次本地事务提交数据,减库存会和商品数据库创建连接通过一次本地事务提交数据,因为下单扣减库存是通过两个数据库连接完成,仍然是多次本地事务共同完成一个完整的事务。

2)多服务请求单数据库完成一次事务

下图中虽然用的一个数据库但是通过跨服务远程调用去完成一次事务,也属于分布式事务的场景。

思考下这种场景为什么也属于分布式事务?


相关文章
|
SQL 关系型数据库 数据库
学习分布式事务Seata看这一篇就够了,建议收藏
学习分布式事务Seata看这一篇就够了,建议收藏
26346 2
|
10月前
|
运维 安全 Shell
【运维救火】服务器磁盘满了?教你3招快速定位“空间杀手”并清理
当磁盘写满时,别慌!本文提供一套标准化排查流程:先用 `df -h` 定位问题磁盘,再用 `du` 命令层层深入找出大文件;清理时推荐清空而非删除日志,避免句柄泄露。若空间未释放,可用 `lsof | grep deleted` 查找被占用的文件并重启对应服务。四步冷静救火,快速恢复系统稳定。
|
5月前
|
人工智能 自然语言处理 前端开发
零基础如何入门Vibe Coding:别怕,你离“开发者”只差一个AI的距离
在AI时代,“氛围编程”(Vibe Coding)正打破编程门槛:无需基础,不用背语法,只需用自然语言描述想法,AI即刻生成可用代码。本文以商科小白视角,揭秘如何零基础用AiPy等工具实现自动化办公、创意网页、数据分析等真实场景,让每个人成为数字世界的创造者。
|
7月前
|
网络协议 Java Unix
从 BIO 到 AIO 全链路拆解:Reactor 模型演进与高并发 IO 架构落地实战
本文深入解析Java高并发IO模型演进与Reactor架构,从BIO、NIO到AIO的技术发展路径。首先介绍UNIX五种IO模型标准,详细对比同步/异步、阻塞/非阻塞的核心差异。重点剖析NIO的三大组件(Channel、Buffer、Selector)实现原理,并通过完整代码示例展示BIO/NIO/AIO的服务端与客户端实现。系统讲解Reactor模型的三个阶段演进:单线程→单Reactor多线程→主从Reactor多线程,结合Netty框架展示工业级实现方案。最后提供线程模型优化、TCP参数调优等最佳实践
358 3
|
10月前
|
弹性计算 运维 监控
【运维排查】服务器CPU飙升100%?别慌,教你3步精准定位“罪魁祸首”
当服务器CPU飙高时,别急着重启!本文教你四步精准排查:用`top`定位高占用进程,`top -Hp`找出耗CPU线程,`printf`转十六进制,再通过`jstack`结合线程ID定位到具体代码行。快速锁定死循环、频繁GC或复杂计算等问题根源,成为团队中的故障排查高手。
|
10月前
|
JSON NoSQL 关系型数据库
【技术选型】MongoDB vs MySQL:一场没有输家的“双雄对决”
本文深入对比MySQL与MongoDB的核心差异,从理念、性能到实战场景。MySQL严谨规范,适合高一致性业务;MongoDB灵活高效,契合多变需求。通过电商案例解析,揭示两者互补而非替代的关系,帮助开发者按场景选型,实现技术价值最大化。
|
10月前
|
人工智能 自然语言处理 数据可视化
构建AI智能体:五十六、从链到图:LangGraph解析--构建智能AI工作流的艺术工具
本文介绍了LangGraph这一基于LangChain的库,它突破了传统线性链式开发的局限,通过图计算模型实现复杂AI应用的构建。LangGraph的核心优势在于:1)支持动态图结构,实现循环和条件路由;2)内置状态管理,维护应用数据流;3)天然支持多智能体协作。与传统开发方式相比,LangGraph通过节点、边和状态的抽象,提供了更清晰的业务逻辑表达、更健壮的错误处理、更好的可观测性,以及更便捷的团队协作和功能扩展能力。
1847 10
|
10月前
|
SQL 容灾 数据库
分布式事务Seata
本章节深入探讨分布式事务问题,涵盖CAP定理与BASE理论,重点讲解Seata框架的XA、AT、TCC及SAGA四种模式原理与实现,并指导搭建高可用TC服务集群,确保微服务架构下的数据一致性与系统可靠性。
分布式事务Seata
|
10月前
|
负载均衡 算法 Java
微服务篇
本文详解SpringBoot自动装配原理、启动流程、核心注解@SpringBootApplication组成,以及SpringCloud微服务中注册发现、负载均衡、限流熔断、服务降级等实现方案,涵盖常用起步依赖、配置管理、跨域处理及项目实战配置。
|
NoSQL Java Nacos
SpringCloud集成Seata并使用Nacos做注册中心与配置中心
SpringCloud集成Seata并使用Nacos做注册中心与配置中心
1678 3