认识分布式事务

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

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

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

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

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

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

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

此时代码变为下边这样:

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

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

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

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

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

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

如下图所示:

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

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

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

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

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

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


相关文章
|
SQL 关系型数据库 数据库
学习分布式事务Seata看这一篇就够了,建议收藏
学习分布式事务Seata看这一篇就够了,建议收藏
25502 2
|
1月前
|
人工智能 自然语言处理 前端开发
零基础如何入门Vibe Coding:别怕,你离“开发者”只差一个AI的距离
在AI时代,“氛围编程”(Vibe Coding)正打破编程门槛:无需基础,不用背语法,只需用自然语言描述想法,AI即刻生成可用代码。本文以商科小白视角,揭秘如何零基础用AiPy等工具实现自动化办公、创意网页、数据分析等真实场景,让每个人成为数字世界的创造者。
|
6月前
|
弹性计算 运维 监控
【运维排查】服务器CPU飙升100%?别慌,教你3步精准定位“罪魁祸首”
当服务器CPU飙高时,别急着重启!本文教你四步精准排查:用`top`定位高占用进程,`top -Hp`找出耗CPU线程,`printf`转十六进制,再通过`jstack`结合线程ID定位到具体代码行。快速锁定死循环、频繁GC或复杂计算等问题根源,成为团队中的故障排查高手。
|
6月前
|
JSON NoSQL 关系型数据库
【技术选型】MongoDB vs MySQL:一场没有输家的“双雄对决”
本文深入对比MySQL与MongoDB的核心差异,从理念、性能到实战场景。MySQL严谨规范,适合高一致性业务;MongoDB灵活高效,契合多变需求。通过电商案例解析,揭示两者互补而非替代的关系,帮助开发者按场景选型,实现技术价值最大化。
|
6月前
|
SQL 容灾 数据库
分布式事务Seata
本章节深入探讨分布式事务问题,涵盖CAP定理与BASE理论,重点讲解Seata框架的XA、AT、TCC及SAGA四种模式原理与实现,并指导搭建高可用TC服务集群,确保微服务架构下的数据一致性与系统可靠性。
分布式事务Seata
|
6月前
|
负载均衡 算法 Java
微服务篇
本文详解SpringBoot自动装配原理、启动流程、核心注解@SpringBootApplication组成,以及SpringCloud微服务中注册发现、负载均衡、限流熔断、服务降级等实现方案,涵盖常用起步依赖、配置管理、跨域处理及项目实战配置。
|
NoSQL Java Nacos
SpringCloud集成Seata并使用Nacos做注册中心与配置中心
SpringCloud集成Seata并使用Nacos做注册中心与配置中心
1565 3
|
负载均衡 监控 Java
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
33399 8
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
|
存储 SQL 关系型数据库
【MySQL进阶-03】深入理解mysql的索引分类,覆盖索引,覆盖索引失效,回表,MRR
【MySQL进阶-03】深入理解mysql的索引分类,覆盖索引,覆盖索引失效,回表,MRR
820 0