分布式事务实现机制及二阶段提交

news2024/12/26 22:51:12

注:本文章引自终于把分布式事务讲明白了!

分布式事务

分布式事务是指在分布式环境下事务,一个事务由多个数据库节点共同完成。分布式事务也必须要保证事务的ACID的特性。
实现分布式事务原子性的通常做法就是采用两阶段提交协议,不过也有特殊的使用一阶段提交+补偿回滚机制。

两阶段提交协议

一阶段提交是无法保证分布式事务的一致性的,举个简单的转账的例子,B向C转账100元,B和C在两个不同的节点上。由于分布式环境中无法保证两个节点的时钟完全一致,这样有可能会发生B扣款成功但C收款失败的情况,因此就无法保证这个事务是一致的。
在这里插入图片描述
为了解决分布式环境下的事务一致性问题,Jim Gray等研究者在1978年提出了两阶段提交协议。两阶段提交协议可以用于单机系统中由事务管理器协调多个资源管理器,也可以用于分布式系统中由一个全局的事务管理器协调各个子系统的局部事务管理器完成两阶段提交。
经典的两阶段提交协议中,有两个角色,即协调者(Coordinator)和参与者(Participant)。
事务的提交分成2个阶段,第一阶段称为投票(prepare)阶段,第二阶段称为决定(commit)阶段。在第一阶段,假设有一个事务完成操作并决定提交,首先需要由协调者发一个prepare消息给参与者,参与者们接收到消息后,根据自己的实际情况,如果可以处理提交就回复一个ready告知已经准备好提交。当协调者接收到所有参与者的确认消息后才会发送commit消息让参与者们进行提交。如果有节点回复无法提交则整个事务将不能执行,协调者会发送abort命令给所有参与者。
在这里插入图片描述
下面结合两阶段协调和日志操作来看一下具体是怎样实现的,我们假设协调者是A,参与者是B和C。
在这里插入图片描述

  • 第1阶段。协调者A的事务管理器将 <prepare,T> 加入日志中并强制写到磁盘,然后将prepare T的消息发到所有参与者B和C。B和C的事务管理器在接到prepare消息后,决定是否提交T中属于自己的那部分操作,如果不能提交,事务管理器就在日志中加一个<not prepared,T>记录,并且向A发送abort T作为响应,如果能提交,事务管理器就在日志中加一个<ready,T>记录并且将所有与T相关的日志强制写到磁盘,然后向A回复一条ready T作为响应。
  • 第2阶段。当A收到所有参与者消息回答后,就可以确定T是提交还是终止。如果A收到所有参与者的ready应答消息后,该事务可以提交,否则该事务就必须回滚。提交事务T时,将<commit,T>(或<abort,T>,如果中止事务)日志记录写入日志,并且强制写到磁盘,并且将commit消息(或abort消息)发给所有参与者,其他节点收到commit消息后将<commit,T>写入日志。最后,参与者向协调者发送确认消息,A收到所有参与者确认消息后,把记录<complete,T>加入日志文件中。

在两阶段提交过程中,可能会发生一些故障,比如:

  • 参与者故障。如果参与者故障后恢复,根据日志记录来决定重做或撤销事务T。是否有<ready,T>记录或<commit,T>记录。
  • 协调者故障。如果协调者发生故障,在某些情况下,参与者会不知道是否提交事务,所以必须等协调者从失败中恢复。

如果协调者回复的时间不确定,参与者需要持有事务T的资源,等待协调者消息,这会造成阻塞。如果由于网络原因,协调者的提交或撤销消息迟迟不能发到参与者,也会造成阻塞。针对这种阻塞问题,业界提出的优化比如三阶段提交,就是在协调者和参与者上面增加了一些超时的机制,不过三阶段的实现代价较高,目前很少在业界使用。两阶段协议虽然存在一些问题,但数据库实现者可以通过一些方式来规避。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/351494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

07- Rossmann商店销售预测 (Xgboost集成算法) (项目七)

查看数据是否为空: train.isnull().sum()查看特征元素: train[StateHoliday].unique() # array([0, a, b, c], dtypeobject)绘制热力图: sns.heatmap(df_train.corr(),cmap RdYlGn_r,annotTrue,vmin -1,vmax1)合并商店信息和销售数据: train pd.merge(train, store, on …

高校房产管理系统有哪些管理功能范围?

数图互通高校房产管理系统是基于公司自主研发的FMCenterV5.0平台&#xff0c;是针对中国高校房产的管理特点和管理要求&#xff0c;研发的一套标准产品&#xff1b;通过在中国100多所高校的成功实施和迭代&#xff0c;形成了一套成熟、完善、全生命周期的房屋资源管理解决方案。…

世界上最健康的程序员作息表!「值得一看」

昨晚看了一篇“传说中”的“世界上最健康的作息时间表”&#xff0c;开始纠结自己还要不要5点半起床。 都说程序员这一行&#xff0c;猝死概率极高&#xff0c;究其原因还是加班太狠、作息不规律、缺乏运动… 今天和大家分享一下这篇文章&#xff0c;还是非常值得参考的&#…

基于Java+SpringBoot+Vue+Uniapp前后端分离商城系统设计与实现

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战✌ 博主作品&#xff1a;《微服务实战》专栏是本人的实战经验总结&#xff0c;《Spring家族及…

PyQt5 界面预览工具

简介 一款为了预览PyQt5设计的UI界面而开发的工具&#xff0c;使用时需要结合PyCharm同时使用。 下载 PyQt5界面预览工具 参数说明 使用配置 启动PyCharm&#xff0c;找到File -> Settings&#xff0c;打开 找到Tools -> External Tools点击打开&#xff0c;在新界面…

GuLi商城-SpringCloud Alibaba-Nacos注册中心

简介&#xff1a; Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;是构建以 “服务” 为中心的现代应用架构 (例 如微服务范式、云原生范式) 的服务基础设施。致力于服务发现、配置和管理&#xff0c;且提供了一组简单 易用的特性集。让微服务的发现…

GEE学习笔记 八十一:【GEE之Python版教程十二】

这一节介绍一下日期类&#xff0c;那么GEE基础的类型基本上介绍完成。后续开始介绍GEE在遥感GIS处理上的一些API内容&#xff0c;比如矢量数据、栅格数据处理等。 这段代码是在程序之前必须执行的&#xff0c;用来注册GEE。 import ee ee.Initialize() 1、日期类API 首先看一…

C语言-文件操作-10

题目&#xff1a; 修改下列程序&#xff0c;用命令行界面代替交互式界面 #include <stdio.h> #include <stdlib.h> #include <string.h> #define BUFSIZE 4096 #define SLEN 81 void append(FILE * source,FILE * dest); char * s_gets(char * st,int n); i…

Spring3定时任务

简介 Spring 内部有一个 task 是 Spring 自带的一个设定时间自动任务调度&#xff0c;提供了两种方式进行配置&#xff0c;一种是注解的方式&#xff0c;而另外一种就是 XML 配置方式了;注解方式比较简洁&#xff0c;XML 配置方式相对而言有些繁琐&#xff0c;但是应用场景的不…

借助 APISIX Ingress,实现与注册中心的无缝集成

作者张晋涛&#xff0c;API7.ai 云原生技术专家&#xff0c;Apache APISIX PMC 成员&#xff0c;Apache APISIX Ingress Controller 项目维护者。 原文链接 云原生场景下是否需要服务发现 背景 微服务架构是当前最为流行的应用架构之一。 应用被拆分为多个服务组件&#xff…

流批一体架构在快手的实践和思考

摘要&#xff1a;本文整理自快手技术专家、Apache Flink & Apache Calcite Committer 张静&#xff0c;在 FFA 流批一体专场的分享。本篇内容主要分为四个部分&#xff1a;Flink 在快手的发展流批一体在快手的规划第一阶段&#xff08;加强批能力&#xff09;的进展第二阶段…

什么是refresh?Spring refresh 流程

refresh 是 AbstractApplicationContext 中的一个方法&#xff0c;负责初始化 ApplicationContext 容器&#xff0c;容器必须调用 refresh 才能正常工作。它的内部主要会调用 12 个方法&#xff0c;我们把它们称为 refresh 的 12 个步骤&#xff1a;1. prepareRefresh2. obtain…

js将数字转十进制+十六进制(联动el-ui下拉选择框)

十进制与十六进制的整数转化一、十进制转十六进制二、十六进制转十进制三、联动demo一、十进制转十六进制 正则表达式&#xff1a; /^([0-9]||([1-9][0-9]{0,}))$/解析&#xff1a;[0-9]代表个位数&#xff0c;([1-9][0-9]{0,})代表十位及以上 二、十六进制转十进制 正则表达…

问卷数据分析流程

文章目录一、数据合并1. 读取数据2. 数据预览二、数据清洗1. 检验ID是否重复&#xff0c;剔除ID重复项2. 剔除填写时间小于xx分钟的值3.处理 量表题 一直选一个选项的问题三、数据清洗1.1 将问卷单选题的选项code解码&#xff0c;还原成原来的选项1.2 自动获取单选题旧的选项列…

object类的equals和hashCode

Object类–基类 equals方法 Object类中的equals方法,底层是用的是""来实现的, 如果比较的两个数是基本类型,就是在比较其值是否相等; 如果比较的两个数是引用数据类型,那么就是比较其地址是否相等 如果输出语句是System.out.println(ab) 输出的是false ,因为a和b …

AcWing 841. 字符串哈希

题目描述 分析&#xff1a; 字符串 hash 小试牛刀 我们在之前模拟散列时&#xff0c;设置的哈希函数为将一个元素(element, e)输入哈希函数中&#xff0c;输出是一个整数&#xff0c;而那时的 eee 为一个有范围的整数。现在我们考虑更复杂的情形&#xff0c;eee 为一个字符串…

论文笔记NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

NeRF使用神经网络来表示场景。给定一个场景&#xff0c;输入该场景稀疏的视角图片&#xff0c;NeRF可以合成该场景新的视角的图片。 神经辐射场 神经辐射场&#xff08;neural radiance field&#xff0c;NeRF&#xff09;使用5D的向量值函数表示一个场景。 输入是连续的5D坐…

LeetCode 160. 相交链表

原题链接 难度&#xff1a;easy\color{Green}{easy}easy 题目描述 给你两个单链表的头节点 headAheadAheadA 和 headBheadBheadB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 nullnullnull 。 图示两个链表在节点 c1…

分享12款我常用的开源免费软件

嗨,大家好, 我是徐小夕, 在一个劳动力追求高性价的时代, 我们无时无刻不在追寻更高的工作学习效率, 提高工作舒适度,接下来我就和大家分享一下我之前用过的, 能提高工作效率的开源免费工具.1. 修图&#xff1a;Krita 【开源】image.png地址: https://krita.org/zh/Krita 是一款…

CK-GW06-E03与欧姆龙PLC配置指南

CK-GW06-E03与欧姆龙PLC配置指南CK-GW06-E03是一款支持标准工业EtherCAT协议的网关控制器,方便用户集成到PLC等控制系统中。本控制器提供了网络 POE 供电和直流电源供电两种方式&#xff0c;确保用户在使用无POE供电功能的交换机时可采用外接电源供电&#xff1b;系统还集成了六…