认识分布式事务

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

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

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

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

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

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

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

此时代码变为下边这样:

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

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

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

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

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

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

如下图所示:

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

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

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

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

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

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


相关文章
|
6月前
|
数据安全/隐私保护
贴吧自动发帖工具, 贴吧自动评论脚本,顶贴回复发帖插件
这个代码实现了贴吧自动发帖、自动回复、获取帖子列表等功能。主要使用了requests库进行网络请求
|
1天前
|
人工智能 Java 微服务
微服务保护方案
Spring Cloud微服务中,服务保护机制对保障系统稳定性至关重要,主要包括熔断、降级、超时、线程隔离和限流。熔断快速失败避免雪崩,降级提供默认响应保证核心功能,超时防止长时间等待,线程隔离限制故障影响范围,限流控制流量峰值,共同提升系统容错与可用性。
微服务保护方案
|
1天前
|
Java Maven 数据库
Activiti工程搭建
本教程介绍如何在IntelliJ IDEA中创建Maven工程并安装ActiBPM插件,包含插件下载、版本兼容性修复及配置方法,最后引入Activiti相关依赖,完成流程引擎环境搭建。
Activiti工程搭建
|
1天前
|
监控 Java Sentinel
Sentinel安装与集成
介绍如何切换hmall-micro项目至dev_02分支并提交代码,强调多分支并行开发模式。随后讲解Sentinel服务保护框架的安装与配置,包括控制台部署、本地运行及项目集成,实现微服务熔断降级,并通过簇点链路监控接口。
Sentinel安装与集成
|
2天前
|
缓存 前端开发 安全
数据同步原理
Soul网关通过推拉模式实现配置数据同步,支持WebSocket、HTTP长轮询和Zookeeper三种策略。管理员在后台变更配置后,事件被发布并根据同步策略推送到网关,实现秒级更新。HTTP长轮询借鉴Apollo与Nacos设计,结合异步Servlet机制,确保准实时且高效。
数据同步原理
|
1天前
|
存储 算法 BI
xxljob本地运行
本文介绍XXL-JOB分布式任务调度框架的部署与使用,涵盖源码获取、服务端数据库配置、客户端注册及任务调度配置,支持多种路由策略与分片广播,助力高效实现定时任务管理。
 xxljob本地运行
|
1天前
|
存储 安全 Java
认证源码分析与自定义后端认证逻辑
本文深入分析Spring Security认证流程,从UsernamePasswordAuthenticationFilter切入,详解AuthenticationManager、ProviderManager及AbstractUserDetailsAuthenticationProvider的认证机制,最终实现自定义UserDetailsService,完成基于数据库的用户认证逻辑。
 认证源码分析与自定义后端认证逻辑
|
1天前
|
Java Sentinel 微服务
实现降级
本文介绍如何在Spring Cloud微服务中通过Sentinel实现Feign接口的降级处理。重点采用`FallbackFactory`方式,在调用方(如cart-service)为`ItemClient`接口编写降级逻辑,捕获远程调用异常并返回兜底数据。需配置Feign启用Sentinel,定义降级类实现`FallbackFactory`接口,并在`@FeignClient`中指定`fallbackFactory`。最终通过停止item-service进行测试,验证购物车页面在商品信息获取失败时仍可降级展示,保障系统稳定性。适用于服务熔断与容错场景。
实现降级
|
2天前
|
Java Linux 开发工具
Linux
本文介绍如何将一个简单的SpringBoot应用打包并部署到Linux服务器。包括项目搭建、JAR包打包、JDK安装配置、应用上传与启动,以及通过心跳接口验证服务是否正常运行的完整流程,适用于Java应用的Linux部署入门学习。
|
1天前
|
Java Shell 开发工具
【Git入门】Git常用命令大全:从add到push,一图胜千言
本文深入浅出地讲解Git核心概念与常用命令,涵盖工作区、暂存区、本地仓库和远程仓库三大区域,梳理从配置、克隆、提交到同步的完整流程,并介绍撤销修改、查看历史、.gitignore等实用技巧,助力开发者高效协作。