当前位置: 首页 > news >正文

分布式事务问题

分布式事务问题

1、什么是分布式事务

一次课程发布操作需要向数据库、redis、elasticsearch、MinIO写四份数据,这里存在分布式事务问题。

什么是分布式事务?

首先理解什么是本地事务?

平常我们在程序中通过spring去控制事务是利用数据库本身的事务特性来实现的,因此叫数据 库事务,由于应用主要靠关系数据库来控制事务,而数据库通常和应用在同一个服务器,所以基于关系型数据库的事务又被称为本地事务。

本地事务具有ACID四大特性,数据库事务在实现时会将一次事务涉及的所有操作全部纳入到一个不可分割的执行单元,该执行单元中的所有操作 要么都成功,要么都失败,只要其中任一操作执行失败,都将导致整个事务的回滚。

理解了本地事务,什么是分1事务?

现在的需求是课程发布操作后将数据写入数据库、redis、elasticsearch、MinIO四个地方,这四个地方已经不限制在一个数据库内,是由四个分散的服务去提供,与这四个服务去通信需要网络通信,而网络存在不可到达性,这种分布式系统环境下,通过与不同的服务进行网络通信去完成事务称之为分布式事务。

在分布式系统中分布式事务的场景很多:

例如用户注册送积分,银行转账,创建订单减库存,这些都是分布式事务。

拿转账举例:

我们知道本地事务依赖数据库本身提供的事务特性来实现,因此以下逻辑可以控制本地事务:

Java
begin transaction
//1.本地数据库操作:张三减少金额
//2.本地数据库操作:李四增加金额
commit transation;

但是在分布式环境下,会变成下边这样:

Java
begin transaction
//1.本地数据库操作:张三减少金额
//2.远程调用:让李四增加金额
commit transation;

 

可以设想,当远程调用让李四增加金额成功了,由于网络问题远程调用并没有返回,此时本地事务提交失败就回滚了张三减少金额的操作,此时张三和李四的数据就不一致了。

因此在分布式架构的基础上,传统数据库事务就无法使用了,张三和李四的账户不在一个数据库中甚至不在一个应 用系统里,实现转账事务需要通过远程调用,由于网络问题就会导致分布式事务问题。

下边的场景都会产生分布式事务:

微服务架构下:

单服务多数据库:

多服务单数据库:

2. 什么是CAP理论

控制分布式事务首先需要理解CAP理论,什么是CAP理论?

CAP是 Consistency、Availability、Partition tolerance三个词语的缩写,分别表示一致性、可用性、分区容忍性。

使用下边的分布式系统结构 进行说明:

客户端经过网关访问用户服务的两个结点,一致性是指用户不管访问哪一个结点拿到的数据都是最新的,比如查询小明的信息,不能出现在数据没有改变的情况下两次查询结果不一样。

可用性是指任何时候查询用户信息都可以查询到结果,但不保证查询到最新的数据。

分区容忍性也叫分区容错性,由于网络通信异常导致请求中断、消息丢失,但服务依然对外提供服务。

CAP理论要强调的是在分布式系统中这三点不可能全部满足,由于是分布式系统就要满足分区容忍性,因为服务之间难免出现网络异常,不能因为局部网络异常导致整个系统不可用。

满足P那么C和A不能同时满足:

比如我们添加一个用户小明的信息,该信息先添加到结点1中,再同步到结点2中,如下图:

如果要满足C一致性,必须等待小明的信息同步完成系统才可用(否则会出现请求到结点2时查询不到数据,违反了一致性),在信息同步过程中系统是不可用的,所以满足C的同时无法满足A。

如果要满足A可用性,要时刻保证系统可用就不用等待信息同步完成,此时系统的一致性无法满足。

所以在分布式系统中进行分布式事务控制,要么保证CP、要么保证AP。

3. 分布式事务控制方案

学习CAP理论该如何控制分布式事务呢?

学习了CAP理论我们知道进行分布式事务控制要在C和A中作出取舍,保证一致性就不要保证可用性,保证可用性就不要保证一致,首先你确认是要CP还是AP,具体要根据应用场景进行判断。

CP的场景:满足C舍弃A,强调一致性。

跨行转账:一次转账请求要等待双方银行系统都完成整个事务才算完成,只要其中一个失败另一方执行回滚操作。

开户操作:在业务系统开户同时要在运营商开户,任何一方开户失败该用户都不可使用,所以要满足CP。

AP的场景:满足A舍弃C,强调可用性。

订单退款,今日退款成功,明日账户到账,只要用户可以接受在一定时间内到账即可。

注册送积分,注册成功积分在24分到账。

支付短信通信,支付成功发短信,短信发送可以有延迟,甚至没有发送成功。

在实际应用中符合AP的场景较多,其实虽然AP舍弃C一致性,实际上最终数据还是达到了一致,也就满足了最终一致性,所以业界定义了BASE理论。

什么是BASE理论?

BASE 是 Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent (最终一致性)三个短语的缩写。

基本可用:当系统无法满足全部可用时保证核心服务可用即可,比如一个外卖系统,每到中午12点左右系统并发量很高,此时要保证下单流程涉及的服务可用,其它服务暂时不可用。

软状态:是指可以存在中间状态,比如:打印自己的社保统计情况,该操作不会立即出现结果,而是提示你打印中,请在XXX时间后查收。虽然出现了中间状态,但最终状态是正确的。

最终一致性:退款操作后没有及时到账,经过一定的时间后账户到账,舍弃强一致性,满足最终一致性。

相关文章:

  • 终于解决了悬疑好多年的低版本CAD VBA不能在高版本CAD使用的问题
  • SpringBoot 项目的创建与启动
  • 百科创建:7种有效的百科词条创建技巧
  • 天狗实战SpringBoot+Vue(二)项目结构搭建(上)
  • k8s容器集群工作负载节点跨越多个云计算厂商
  • 专题五:DFS深度优先搜索
  • 【计算机网络】从输入网址到网页显示,期间发生了什么?
  • ZMC408CE | 实现“8通道独立PSO”应用场景
  • pytorch中.data与.item(),.numpy(),.detach(),.cuda(),.cpu()的作用
  • 从参数数量视角理解深度学习神经网络算法 DNN, CNN, RNN, LSTM 以python为工具
  • 如何使用ChatGPT API 及 问题解决
  • Linux0.11 任务切换(七)
  • Lighttpd入门教程
  • 为什么汽车控制器应用层软件开发要采用AUTOSAR的架构接口
  • # 飞书APP集成平台-数字化落地
  • 「译」Node.js Streams 基础
  • angular学习第一篇-----环境搭建
  • cookie和session
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Mysql5.6主从复制
  • Otto开发初探——微服务依赖管理新利器
  • Python语法速览与机器学习开发环境搭建
  • 编写高质量JavaScript代码之并发
  • 构造函数(constructor)与原型链(prototype)关系
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 我的面试准备过程--容器(更新中)
  • 异常机制详解
  • 在Mac OS X上安装 Ruby运行环境
  • ​​​​​​​​​​​​​​Γ函数
  • ​io --- 处理流的核心工具​
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (4)STL算法之比较
  • (Python) SOAP Web Service (HTTP POST)
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (图)IntelliTrace Tools 跟踪云端程序
  • (转)ABI是什么
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET Core 2.1路线图
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • ::什么意思
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [ JavaScript ] JSON方法
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法
  • [ARM]ldr 和 adr 伪指令的区别
  • [C# 基础知识系列]专题十六:Linq介绍
  • [Codeforces] combinatorics (R1600) Part.2
  • [DL]深度学习_Feature Pyramid Network
  • [ExtJS5学习笔记]第三十节 sencha extjs 5表格gridpanel分组汇总
  • [java基础揉碎]关系运算符(比较运算符)逻辑运算符赋值运算符三元运算符运算符的优先级
  • [Latex学习笔记]数学公式基本命令