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

什么是分布式事务

目录

分布式事务基础

事务

本地事务

分布式事务

分布式事务的场景

 分布式事务解决方案

全局事务

 优点

缺点

可靠消息服务

 第一步 :消息由系统A投递到中间件

超时访问机制

最大努力通知

 第一步:消息由系统A投递到中间件

第二步:消息中间件投递到系统B

这种方式的优缺点:

TCC事务

 TCC两阶段提交与XA两阶段提交的区别是:

TCC事务的优缺点:

        优点: 

        缺点:


分布式事务基础

事务

事务就是一个操作单元,在这个操作单元中的所有操作最终要保持一致的行为,要么所有操作都成功,要么所有操作都被撤销。也就是说,事务提供了一种“要么什么都不做,要么全做”的机制。

本地事务

本地事务其实可以认为是数据库提供的事务机制。说到数据库事务就不得不说,数据库事务中的四大特性:

        A: 原子性(Atomiity),一个事务中的所有操作,要么全部完成,要么完全不成功

        B: 一致性(Consistency),在一个事务执行之前和执行之后数据库都必须处于一致性状态

        I:隔离性(Isolation),在并发环境中,当不同的事务同时操作相同的数据时,事务之间互不影响。

        D:持久性(Durability),指的是只要事务成功结束,它对数据库所做的更新就必须永久的保存下来

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

分布式事务

分布式事务指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同结点之上。

简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用分布式事务需要保证这些小操作要么全部成功,要么全部失败。

本质上来说,分布式事务就是为了保证不容数据库的数据一致性。

分布式事务的场景

单体系统访问多个数据库

一个服务需要调用多个数据库实列完成数据的增删改操作

多个微服务访问同一个数据库

多个服务需要调用一个数据库实列完成数据的增删改操作

 多个微服务访问多个数据库

多个服务需要调用一个数据库实列完成数据的增删改操作

 

 分布式事务解决方案

全局事务

全局事务基于DTP模型实现。DTP是由X/Open组织提出的一种分布式事务模型X/Open Distributed  Transaction Processing Reference Model。它规定了要实现分布式事务,需要三种角色:

        AP:Application 应用系统(微服务)

        TM:Transaction Manager 事务管理器(全局事务管理)

        RM:Resource Manager 资源管理器(数据库)

整个事务分成两个阶段:

        第一阶段:表决阶段,所有参与者都将本事务执行预提交,并将能否成功的消息反馈发给协调者。

        第二阶段:执行阶段,协调者根据所有参与者的反馈,通知所有参与者,步调一致地执行提交或者回滚。

 优点

        提高了数据一致性的概率,实现成本较低

缺点

        单点问题:事务协调者宕机

        同步阻塞:延迟了提交时间,加长了资源阻塞时间

        数据不一致:提交第二阶段,依然存在commit结果未知的情况,有可能导致数据不一致。

可靠消息服务

基本可靠消息服务的方案是通过消息中间件保证上、下游应用数据操作的一致性。假设有A和B两个系统,分别可以处理任务A和任务B。此时存在一个业务流程,需要将任务A和任务B在一个事务中处理。就可以使用消息中间件来实现这种分布式事务。

 第一步 :消息由系统A投递到中间件

        1.在系统A处理任务A前,首先向消息中间件发送一条消息

        2.消息中间件收到后将该条消息持久化,但并不投递。持久化成功后,向A回复一个确认应答

        3.系统A收到确认应答后,则可以开始处理任务A

        4.任务A处理完成后,向消息中间件发送Commit或者Rollback请求。该请求发送完成后,对系统A而言,该事务的处理过程就结束了

        5.如果消息中间件收到Commit,则向B系投递消息,如果收到Rollback,则直接丢弃消息。但是 如果消息中间件收不到Commit和Rollback指令,那么就要依靠“超时询问机制”。

超时访问机制

系统A除了实现正常的业务流程外,还需要提供一个事务询问的接口,供消息中间件调用。当消息中间件收到发布消息便开始计时,如果到了超时没收到确认指令,就会主动调用系统A提供的事务询问接口  询问该系统目前的状态。该接口会返回三种结果,中间件根据三种结果做出不同反应:

        提交:将该消息投递给系统B

        回滚:直接将条件消息丢弃

        处理中:继续等待

第二步:消息由中间件投递到系统B

消息中间件 向下游系统投递完信息后便进入堵塞等待状态,下游系统便立即进行任务的处理,任务处理完成后便向消息中间件返回应答。

        如果消息中间件收到确认应答后便认为该事务处理完毕

        如果消息中间件在等待确认应答超时之后就会重新投递,直到下游消费者返回消费成功响应为止。一般消息中间件可以设置消息重试的次数和时间间隔,如果最终还是不能成功投递,则需手工干预。这里之所以使用人工干预,而不是使用让A系统回滚,主要是考虑到整个系统设计的复杂度问题。

        基本可靠消息服务的分布式事务,第一部分使用异步,因为注重性能;后半部分使用同步,注重开发的成本。

最大努力通知

最大努力通知就是定期进行校对,其实是对第二种解决方案的进一步优化。它引入了本地消息表来记录错误消息。然后加入失败的消息的  校对功能,来做进一步的保证消息会被下游的系统消费。

 第一步:消息由系统A投递到中间件

        1.处理业务的同一个事务中,向本地消息表中写入一条记录

        2.准备专门的消息发送者不断的发送本地消息表中的消息到消息中间件中,如果发送失败则重新发送

第二步:消息中间件投递到系统B

         1.消息中间件 接收到消息后 负责将该消息同步 投递给相应的相应的下游系统,并触发下游系统的任务进行执行

        2.然后当下游系统处理成功后,向消息中间件  反馈确认应答,消息中间件便可以将该条消息删除,从而该事务完成。

        3.对于投递失败的消息,可以利用重试机制进行重试,对于重试失败的则写入错误消息表中

        4.消息中间件需要提供失败消息的查询接口,下游系统会定期查询失败的消息,并将其消费者

这种方式的优缺点:

        优点: 一种非常经典的实现,实现了最终一致性

        缺点:消息表会耦合到业务系统中,所以要进行其他的方法进行解决

TCC事务

TCC即为Try Confirm Cancel,它属于补偿型分布式事务。TCC实现分布式事务一共有三个步骤:

   Try:尝试待执行的业务

        这个过程呢并未执行业务,而是完成所有业务的一致性检查,并预留好执行所需的全部资源

   Confirm:确认执行业务

        确认执行业务操作,不做任何业务检查,只使用Try阶段预留的业务资源。通常情况下,采用TCC 则认为Confirm阶段是不会出错的。只要Try成功,Confirm一定成功。若Confirm阶段真的出错了,需引入重试机制或人工处理

    Cancel:取消待执行的业务

        取消Try阶段预留的业务资源。通常情况下,采用TCC则认为Cancel阶段也是一定成功的。若Cancel阶段真的出错了,需引入重试机制或人工处理。

 TCC两阶段提交与XA两阶段提交的区别是:

        XA是资源层面的分布式事务,强一致性,在两阶段提交的整个过程中,一直会持有资源的锁。

        TCC是业务层的分布式事务,最终一致性,不会一直持有资源的锁。

TCC事务的优缺点:

        优点: 

                把数据库层的二阶段提交  ,提到了应用层面来实现,规避了数据库层的2PC性能低下问题。

        缺点:

                TCC的Try、Confirm和Cancel操作功能需业务提供,开发成本高。

相关文章:

什么是分布式事务

目录 分布式事务基础 事务 本地事务 分布式事务 分布式事务的场景 分布式事务解决方案 全局事务 优点 缺点 可靠消息服务 第一步 :消息由系统A投递到中间件 超时访问机制 最大努力通知 第一步:消息由系统A投递到中间件 第二步:消息…...

在 Python 中将整数转换为罗马数字

罗马数字使用以下七个符号书写。 Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000这些符号用于表示数以千计的数字。 罗马写20,可以用两个X拼成XX。 但是 XXXX 不…...

HashTable,Properties,TreeSet源码分析

目录 HashTable基本介绍 Hashtable和HashMap对比 Properties Properties基本介绍 应该如何选择集合 TreeSet源码分析 HashTable基本介绍 1)存放的元素是键值对:即K-V 2)hashtable的键和值都不能为null,否则会抛出NullPointerException 3)hashTab…...

多维图像去噪方法研究

一、背景介绍 由于传感器技术的快速发展,高光谱(HS)遥感(RS)成像为飞机等数据采集设备远距离观测和分析地球表面提供了大量的空间和光谱信息,航天器和卫星。 HS RS 技术的最新进展甚至革命为实现各种应用的…...

托福口语考察内容和形式

首先我们来简单介绍一下托福口语考试的构成和task1的任务形式。 目录 TOEFL Speaking Test Format Independent Task 1 Task 1 Test Format Task 1 Testing Interface(考试界面)​ Task 1 Question Type...

【地铁上的设计模式】--结构型模式:代理模式

什么是代理模式 代理模式是一种结构型设计模式,通过代理对象控制对原始对象的访问。代理对象充当客户端和实际对象之间的中介,隐藏了实际对象的复杂性,并提供了一些额外的控制。 在软件系统中,代理模式可以有多种应用。例如&…...

Oracle 体系结构

文章目录 Oracle体系结构Oracle的内存结构Oracle的进程结构服务器进程后台进程可选后台进程 物理存储结构逻辑存储结构 概念: Oracle server由Oracle instance和Oracle database组成,Oracle instance由后台进程和共享内存组成,Oracle的实例包…...

java手写日历系统(亲测)

package com.test.test02;import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Scanner;public class Test08 {//这是一个main方法,是程序的入口public static void main(String[] args) {//录入日期的StringScanner sc new Scanner…...

35-40的技术人员为什么会被“不友好”,请你们自身反思-拒做职场的“嗯嗯”怪

35-40真的是IT人员的一道坎吗? IT技术做不到35-40,可是我身边有大量35-40事业发达、职业发展更好的朋友。同时,我身边也有大量35-40被“毕业”的人更多。 本人经过7年来先后带队过3个大型研发团队,最少的也有60-70号人。最多的达到…...

工地烟火AI监控识别分析系统 yolov7

工地烟火AI监控识别分析系统通过yolov7网络模型技术,工地烟火AI监控识别分析系统对工地或者厂区现场监控区域内的烟火进行实时分析报警。YOLOv7 的发展方向与当前主流的实时目标检测器不同,研究团队希望它能够同时支持移动 GPU 和从边缘到云端的 GPU 设备…...

MATLAB算法实战应用案例精讲-【人工智能】对比学习(概念篇)(补充篇)

目录 前言 几个高频面试题目 基于对比学习(ContrastiveLearning)的文本表示模型【为什么】能学到文本【相似】度? 为什么对比学习能学到很好的语义相似度? 那么如何评价这个表示空间的质量呢? 知识储备 监督学习和非监督学习 算法原理…...

代码随想录算法训练营第三十一天 | 贪心1,想不到怎么找局部最优就做不出来

贪心算法理论基础 代码随想录 (programmercarl.com) 贪心算法理论基础!_哔哩哔哩_bilibili 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额&#xff…...

【SVN】版本控制管理的文件(夹)如何重命名

目录 一、前言二、操作步骤1. 使用SVN重命名(SVN rename)2. 输入新名称3. 确定重命名4. 立刻进行一次提交(commit)5. 补充 三、可能遇到的问题1. 情况一2. 情况二3. 情况三 一、前言 如果只是在本地的文件系统中修改SVN中的文件&a…...

必须包含数字,字母组合的密码正则表达式

输入要求:由数字和字母组成,并且要同时含有数字和字母,且长度要在2-64位之间。 ^(?![0-9]$)(?![a-zA-Z]$)[0-9A-Za-z]{2,64}$ 分开来注释一下: ^ 匹配一行的开头位置 (?![0-9]$) 预测该位置后面不全是数字 (?![a-zA-Z]$) 预…...

JavaScript:栈和对列

文章目录 栈和对列Js 有栈与队列吗20. 有效的括号 - 力扣(LeetCode)思路 1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)思路代码分析array.join() 操作打印const s of str 操作遍历 150. 逆波兰表达式求值 - 力扣&#xf…...

[数据库系统] 一、创建表以及使用主键约束(educoder)

1.任务:在数据库中创建一个表。 2.需要掌握: 如何在指定数据库中创建表。 知识点:如何在指定数据库中创建表。 我们先来了解一下在数据库中创建表的规则: CREATE TABLE 表名(字段名,数据类型,字段名,数据类型,.....) 例如&…...

《走进对象村4》之面向对象的第一大特性——封装

文章目录 🚀文章导读1、封装的概念2、访问限定修饰符3、如何进行封装4、封装的优点: 🚀文章导读 在本篇文章中,将详细的对封装进行总结,文章仅仅是个人的一些理解,如果有错误的地方,还望指出看完…...

罗马数字转整数、整数转罗马数字----2023/5/4

罗马数字转整数----2023/5/4 1.罗马数字转整数 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D …...

2023-05-04:用go语言重写ffmpeg的scaling_video.c示例,用于实现视频缩放(Scaling)功能。

2023-05-04:用go语言重写ffmpeg的scaling_video.c示例,用于实现视频缩放(Scaling)功能。 答案2023-05-04: 这段代码实现了使用 libswscale 库进行视频缩放的功能。下面是程序的主要流程: 1.获取命令行参…...

QT Android QTextEdit 复制粘贴文本后出现多余数据问题

目录 问题原因解决方法 问题 QT Android QTextEdit 长按选中文本后,点击复制,然后粘贴到手机便签或者QQ中,出现多余数据 例如,要复制的文本为 只因你太美 但实际在便签中粘贴后的文本为 只因你太美 p, li { white-space: pre-wra…...

知识变现海哥:你为什么努力却不富有,大概率是你不懂这个道理

要有价值观念,要有交换思维。商业的本质都是基于价值交换,你能为别人提供多少价值,你就能赚多少米,你帮助别人处理的问题越多你越有价值,你能成就多少人你就能被多少人成就。这是商业行为的底层逻辑。 你没赚到米 一是…...

【Mybatis】增删改查

1.添加相应的jar包 2.创建持久化类 在src目录下创建一个名为com.mybatis.po的包 创建持久化类MyUser,包含三个属性(uid,uname,usex) package com.mybatis.po; /***springtest数据库中user表的持久化类*/ public class MyUser {private Integer uid;//主键private…...

20230504----重返学习-vue2项目-跳转拦截-重定向并返回前一页-使用vuex调用接口-全选与全不选-总价计算

day-061-sixty-one-20230504-vue2项目-跳转拦截-重定向并返回前一页-使用vuex调用接口-全选与全不选-总价计算 vue2项目 跳转拦截 设置跳转拦截,比如在用户没token时,不能进入具体详情页,而是进入登录页进行登录。 跳转拦截具体思路 前端…...

(异或相消)猫猫数字异或和

E - Red Scarf (atcoder.jp) 刚入坑写的一道题被我拉出来对比分析了 我的思路: 垃圾运气选手凭借直觉乱搞猜出来的,没有思路。 题解思路: 由问题陈述中XOR的定义,我们可以看出计算3个或更多整数的XOR可以以任意顺序进行&#…...

树脂塞孔有哪些优缺点及应用?

树脂塞孔的概述 树脂塞孔就是利用导电或者非导电树脂,通过印刷,利用一切可能的方式,在机械通孔、机械盲埋孔等各种类型的孔内进行填充,实现塞孔的目的。 树脂塞孔的目的 1 树脂填充各种盲埋孔之后,利于层压的真空下…...

【Robot Framework】RF关键字大全

收录工作当中最常用的Robot Framework关键字 内容较多,可以CtrlF快速搜索自己想要的 1. RF循环使用(FOR循环) {list1} create list LOG TXT INI INF C CPP JAVA JS CSS LRC H ASM S ASP FOR ${file_type} IN {list1} log 构造请求参数 ${t…...

Xilinx Artix-7【XC7A35T-2CSG324I】【XC7A35T-1CSG324I】成本与收发器优化的FPGA器件

产品介绍: Xilinx Artix -7系列 FPGA 重新定义了成本敏感型解决方案,功耗比上一代产品降低了一半,同时为高带宽应用提供一流的收发器和信号处理能力。这些设备基于 28 纳米 HPL 工艺构建,提供一流的性能功耗比。与 MicroBlaze™ 软…...

K8S之自定义Controller

简介 在此之前我们先来了解下kubernetes的两个概念"声明式API"和"控制器模式"。"声明式API"核心原理就是当用户向kubernetes提交了一个API对象的描述后,Kubernetes会负责为你保证整个集群里各项资源的状态,都与你的API对象…...

无线电相关的SCI期刊有哪些? - 易智编译EaseEditing

以下是几个无线电相关的SCI期刊: IEEE Transactions on Wireless Communications: 这是一个IEEE无线通信协会的期刊,主要涵盖了无线通信领域的最新研究进展,包括无线网络,通信系统和信号处理等方面。 IEEE Transacti…...

Rust - 结构体基本使用

基础代码示例 为了理解何时需要使用结构体,官方文档给了一个案例,就是计算长方形的面积,这里我们会一步一步的重构代码直到使用结构体为止。 计算长方形的面积的具体逻辑就是获取长方形的宽度和高度,然后通过公式计算出长方形的…...

公司开发个网站/盘多多网盘搜索

www.163.com转载于:https://blog.51cto.com/testice/259978...

做视频网站每部电影都要版权/百度怎么提交收录

GroupBy是个Collector,它是用来进行Stream上的collect操作的。Collect是一个Mutable Reduction。所谓reduction,相当于把集合里的每一个元素依次带入一个函数,最终得到一个值。比如求一组int的和,可以用reduction写作。int sum n…...

给个网站免费的/永久免费无代码开发平台网站

我们知道RabbitMQ可以配置成Queue做主从复制(按照官方的说法叫配置mirror queue),对master queue的写操作会被复制到其他slave上去(也就是复制到mirror queue上去)。这对rabbitmq的这个特性,有些人会问这样…...

网站建设中的技术问题/余姚网站如何进行优化

%{ 1.这就是传说中的多行注释 2.成功! %} 注意是大括号哟...

帮他人做视频网站违法吗/网站外链的优化方法

服务器环境 Liunx AS4 PHP5 Mysql5 Apache 2实用TOP 命令查询系统性能的时候发现CPU经常到达100%开始以为是DDOS攻击……加装了防火墙(没起作用)又开始从liunx系统查找是不是系统问题,(也没起作用)偶尔从网络上发现一篇文章,有人也类似遇到了这样的问题&…...

正规的网店平台有哪些/网站如何提升seo排名

torch.manual_seed(seed)设定生成随机数的种子,并返回一个torch._C.Generator对象,参数:seed(int or long):种子。torch.initial_seed()返回生成随机数的原始种子值(python long)。torch.get_rng_state() 返回随机生成…...