达梦分布式集群DPC_分布式事务理解_yxy

article/2025/8/1 7:12:20

达梦分布式集群DPC_分布式事务理解

  • 1 分布式事务是什么?
  • 2 分布式事务怎么实现?
    • 2.1 两阶段提交保障一致性
      • 2.1.1 预提交
      • 2.1.2 提交
    • 2.2 RAFT协议保障数据强一致
    • 2.3 全局事务管理
      • 2.3.1 全局事务信息的登记流程
      • 2.3.2 数据可见性判断规则

1 分布式事务是什么?

在分布式系统架构下,不同的服务器之间通过网络远程协作而完成的事务,称为分布式事务。

分布式事务会遇到的问题:

在分布式集群中,一个事务可能涉及多个BP节点(数据存储节点)。
例如:
事务T1:在BP1上修改账户A余额,在BP2上修改账户B余额;
事务T2:同时在BP1上读取账户A余额。

若BP1提交成功但BP2尚未提交,T2可能读到BP1已提交但BP2未提交的中间状态数据(如A扣款成功但B未到账),破坏事务隔离性(如“读未提交”)。

2 分布式事务怎么实现?

2.1 两阶段提交保障一致性

在分布式架构时,数据库一致性要求会变的更高。

DPC通过两阶段提交技术来保证多个BP(数据节点)之间的分布式事务一致性

两阶段提交SP(计算节点) 作为全局事务的协调者,统一处理全局事务。
BP 作为参与者,是被 SP 调度并执行事务的节点。
SP 根据 BP 的响应来决定是否真正的执行并提交事务。所有参与者 BP 要么一起提交要么一起回滚,始终保持事务一致性状态。

2.1.1 预提交

左边成功、右边失败示例
在这里插入图片描述

  1. 客户端发起请求:客户端想要提交一个事务,就向SP(协调者)发起了请求。
  2. SP广播预提交命令:SP收到请求后,向所有BP(参与者)发送预提交命令,问它们能不能完成这个事务的提交,然后等着BP们回复。
  3. BP响应:BP们收到预提交命令后,先把操作相关的回滚日志写到回滚段里,然后告诉SP自己这边的情况。
  4. SP判断并处理:
    如果SP收到了所有BP都预提交成功的消息,那它就进入第二阶段,继续完成提交操作。
    但如果有的BP没回复,SP就搞不清楚这个BP到底有没有完成预提交。这时候,SP会先试着通知那些还活着的BP去回滚操作。如果能有BP成功回滚,SP就可以直接告诉客户端“事务提交失败”。但如果回滚也失败了,SP就只能告诉客户端“未知的提交结果”。不管是哪种情况,客户端收到消息后,就知道这个事务没成功。
    在这里插入图片描述

2.1.2 提交

  1. 进入提交阶段:如果SP(协调者)收到所有BP(参与者)都预提交成功的消息,就说明可以开始正式提交事务了。
  2. SP广播提交命令:SP向所有BP发送COMMIT命令,让BP们执行第二阶段的提交任务。BP们收到命令后,开始提交事务,释放占用的资源,并且把提交成功的消息反馈给SP。
  3. SP响应客户端:
    3.1. 如果SP顺利收到所有BP的COMMIT成功消息,就直接告诉客户端“事务提交成功”,整个事务就完成了。
    3.2. 但如果在二阶段提交过程中,BP和SP之间的通信中断了,SP不会一直等,而是把提交任务交给异步任务去处理,自己马上告诉客户端“事务提交成功”。
    3.3. 等到故障的BP和SP重新连上后,异步任务会自动接着执行二阶段提交,直到成功为止。客户端收到“事务提交成功”的消息,就表示这个事务完成了。
    在这里插入图片描述

2.2 RAFT协议保障数据强一致

DPC基于RAFT一致性协议实现多副本数据同步,每个BP组构成一个RAFT组(如3节点组),主库通过异步日志传输(XMAL模块)将Redo日志同步至备库,确保数据强一致。主库故障时,剩余节点自动选举新主库,实现秒级切换

同一个raft组的数据完全一致

例如
三副本架构:BP1_A 、BP1_B 、BP1_C
ABC数据完全相同,同一时间只有A为主库对外提供服务,A故障B自动接管

2.3 全局事务管理

DPC通过全局时钟(Global Timestamp Sequence, GTS) 统一所有节点的事务时序,其核心组件包括:

MP节点:全局时钟管理者,负责分配唯一递增的时钟值(cur_seq);
CA数组(BP端):记录事务预提交/提交状态及时钟值;
MCA数组(MP端):记录所有已提交事务的TID和提交时钟值。

2.3.1 全局事务信息的登记流程

步骤1:事务预提交(一阶段)
BP节点向MP申请当前时钟值pre_seq;
在本地CA数组登记:

TID (事务ID)状态=预提交时钟值=pre_seq

步骤2:事务提交(二阶段)
BP节点向MP申请新时钟值commit_seq;
MP端:在MCA数组登记该事务的提交信息:

TID (事务ID)时钟值=commit_seq

BP端:更新本地CA数组中该事务的状态:

TID (事务ID)状态=提交时钟值=commit_seq

整体流程
在这里插入图片描述

2.3.2 数据可见性判断规则

当一个事务(如T2)操作数据时:

  1. 获取当前时钟:向MP申请当前时钟值cur_seq;
  2. 定位数据修改者:找到目标数据最后一次修改的事务TID(记录在Redo日志中);
  3. 查询CA/MCA数组,按优先级判断可见性:

规则1:直接通过CA判断
① 若CA中该TID的状态为 “提交” 且 ca_seq ≤ cur_seq → 数据可见
(说明修改已提交,且在T2开始前完成)
② 若状态为 “预提交” 但 ca_seq ≤ cur_seq → 需进一步查MCA

规则2:结合MCA二次验证
在MCA中查询该TID:
① 若存在且 mca_seq ≤ cur_seq → 数据可见
(说明事务实际已提交,只是CA状态未及时更新)
② 其他情况(如MCA无记录或mca_seq > cur_seq) → 数据不可见

例如

假设以下场景:
T1:修改数据X(TID=100),在BP1预提交时获时钟pre_seq=50;
T2:在时钟cur_seq=55时尝试读取X;
T1:在时钟commit_seq=60时提交。判断过程:
T2读取X时,发现其最后修改者为TID=100;
查询CA:TID=100的状态为“预提交”,ca_seq=5055 → 需查MCA;
查询MCA:此时尚无TID=100的记录 → X对T2不可见(避免了读取未提交数据)。

总结
DPC的全局时钟系统(GTS)通过 CA/MCA双数组协作 + 全局时序化 设计,将复杂的分布式事务可见性问题转化为时钟值比较问题。


更多其他数据库相关专栏:

1.数据库优化
数据库优化基本思路、索引详解、执行计划、统计信息、CBO原理、单表优化、多表优化、分布式优化、子查询、优化案例等
数据库优化(sql优化)专栏连接

2.达梦分布式数据库:
部署详细步骤(DEM)、备份还原实战、核心特性理解、使用心得、表分区方式详细介绍、表分区最佳实践、DPC架构详解等
达梦分布式DPC专栏连接

3.应用开发类
jdbc、hibernate、ibatis、mybatis、MyBatis-Plus、Spring、中间件mycat、Sharding-JDBC等
达梦数据库应用开发专栏连接


http://www.hkcw.cn/article/VEKEXMylwd.shtml

相关文章

性能优化 - 案例篇:缓冲区

文章目录 Pre1. 引言2. 缓冲概念与类比3. Java I/O 中的缓冲实现3.1 FileReader vs BufferedReader:装饰者模式设计3.2 BufferedInputStream 源码剖析3.2.1 缓冲区大小的权衡与默认值 4. 异步日志中的缓冲:Logback 异步日志原理与配置要点4.1 Logback 异…

【目标检测】检测网络中neck的核心作用

1. neck最主要的作用就是特征融合,融合就是将具有不同大小感受野的特征图进行了耦合,从而增强了特征图的表达能力。 2. neck决定了head的数量,进而潜在决定了不同尺度样本如何分配到不同的head,这一点可以看做是将整个网络的多尺…

基于机器学习的心脏病预测模型构建与可解释性分析

一、引言 心脏病是威胁人类健康的重要疾病之一,早期预测和诊断对防治心脏病具有重要意义。本文利用公开的心脏病数据集,通过机器学习算法构建预测模型,并使用 SHAP 值进行模型可解释性分析,旨在为心脏病的辅助诊断提供参考。 二、…

每日算法-250601

每日算法 - 250601 记录今天完成的算法题目。 1. 1749. 任意子数组和的绝对值的最大值 题目描述 思路 前缀和 解题过程 子数组的和 sum(nums[i..j]) 可以通过前缀和 prefixSum[j] - prefixSum[i-1] 来计算(规定 prefixSum[-1] 0)。 我们要求的是 ab…

算法打开13天

41.前 K 个高频元素 (力扣347题) 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1], k 1 输出: …

【Centos7】最小化安装版本安装docker(无wget命令避坑)

文章目录 Centos7安卓docker1. 检查CentOS内核版本2. 一键将CentOs的yum源更换为国内阿里yum源3. 使用root权限登录CentOS。确保yum包更新到最新4.安装docker5.Docker阿里云镜像加速器 Centos7安卓docker 1. 检查CentOS内核版本 Docker要求CentOS系统的内核版本高于3.10&…

Vue-1-前端框架Vue基础入门之一

文章目录 1 Vue简介1.1 Vue的特性1.2 Vue的版本 2 Vue的基础应用2.1 Vue3的下载2.2 Vue3的新语法2.3 vue-devtools调试工具 3 Vue的指令3.1 内容渲染指令{{}}3.2 属性绑定指令v-bind3.3 事件绑定指令v-on3.4 双向绑定指令v-model3.5 条件渲染指令v-if3.6 列表渲染指令v-for 4 参…

Lighttpd CGI配置:404错误排查实录

目录 引言 编写测试程序 前端代码 后端代码 配置CGI模块(mod_cgi) 如何检查404错误 测试结果 ​编辑 结语 引言 在前面的测试中,我们将lighttpd移植到x210开发板中,今天学生报告说她在进行CGI程序测试时总是遭遇404错误…

卢昌海 | 质量的起源

注:本文为卢昌海 | 质量的起源五篇合辑。 公式巨多,未一一校排。 如有内容异常,请看原文。 卢昌海 | 质量的起源 (一) 一、引言 物理学是一门试图在最基本层次上理解自然的古老科学,其早期曾是哲学的一部…

5、设置时区、链接wifi

一、修改时区: 输入以下命名打开raspbian系统的设置界面 sudo raspi-config 如下图,通过键盘上下键,移动到第 5 步“localisation Options”,回车进入。 注:每个系统版本不一样,选择就不一样,我的是在第…

81、使用DTU控制水下灯光控制

基本思想:记录调试济南有人DTU控制水下灯光控制 一、首先连接dtu设备,进行供电模块的链接和RS-485控制水下探照灯 线头链接方方式示意图,供电线接入之后,要保证设备处于工作状态,如果设备在供电不处于工作状态,那可能火线和零线接反了,请重新接入; 将红色的线接入RS-4…

【js逆向】易车网某车辆对比信息X-sign

目标网址:aHR0cHM6Ly9jYXIueWljaGUuY29tL2JpeWFkaWUyL3BlaXpoaS8 f12刷新网页查看数据接口 断点调试: 我们的目标网址是 param/get_param_details, 用条件断点 e.url.includes(param/get_param/details) 向上跟栈,这里X-Sign已经生成&#x…

基于TMC5160堵转检测技术的夹紧力控制系统设计与实现

点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 90万阅读 1.6万收藏 一、技术背景与系统原理 在工业自动化领域,夹紧力控制是精密装配、机床夹具等场景的核心需求。传统方案多采用压力传感器伺服电机的闭环控制方式,但存在系统复杂…

青岛红狮主教练马永康下课 球队保级压力增大

北京时间5月31日晚,2025赛季中甲第11轮多场比赛展开,广西平果在主场迎战青岛红狮。比赛前,两队分别位于中甲积分榜的倒数第一和第二位。上半场马特乌斯为广西平果打破僵局,下半场双方均未能改写比分。最终,广西平果以1-0战胜青岛红狮,取得联赛首胜并保持了两轮不败,而青…

Maven(黑马)

Maven 是一个强大的项目管理和构建自动化工具,主要用于 Java 项目的构建、依赖管理和文档生成。它通过使用 POM(Project Object Model)文件来管理项目的配置和依赖关系,从而实现项目的自动化构建和管理。以下是 Maven 的一些核心概…

项目练习:element ui 的icon放在button的右侧

文章目录 一、需求描述二、左侧实现三、右侧实现 一、需求描述 我们知道&#xff0c;element ui的button一般都会配置一个icon 这个icon默认是放在左侧的。 如何让它放在右侧了&#xff1f; 二、左侧实现 <el-buttontype"primary"plainicon"el-icon-d-arr…

大连一景区日撒1000斤蚬子 吸引游客赶海乐

近两日,多名网友分享了在辽宁省大连市夏家河子海滨浴场偶遇工作人员开着铲车、三轮车给游客撒蚬子赶海的情景。景区回应称,在沙滩上撒蚬子是为了让赶海的游客都能挖到东西。这两天,景区每天需要撒约1000斤的蚬子。此外,还有巴掌大的鲍鱼和海螺,如果游客捡到可以兑换礼品。…

位运算 #常见位运算总结 #题解

系列文章目录 leetcode - 双指针问题_leetcode双指针题目-CSDN博客 leetcode - 滑动窗口问题集_leetcode 滑动窗口-CSDN博客 高效掌握二分查找&#xff1a;从基础到进阶-CSDN博客 leetcode - 前缀和_前缀和的题目-CSDN博客 动态规划 - 斐波那契数列模型-CSDN博客 目录 系…

openpnp - 给M4x0.7mm的直油嘴加油的工具选择

文章目录 openpnp - 给M4x0.7mm的直油嘴加油的工具选择概述如果换上带卡口的M4x0.7直油嘴END openpnp - 给M4x0.7mm的直油嘴加油的工具选择 概述 X导轨用了一个HG15的滑块 滑块上的注油口的黄油嘴是M4x0.7mm的直油嘴。 外表面是6边形的柱子&#xff0c;没有可以卡住加油嘴工…

SSL/TLS 协议详解:安全通信的基石

一、概述 SSL&#xff08;Secure Sockets Layer&#xff09; 及其继任者 TLS&#xff08;Transport Layer Security&#xff09; 是位于 传输层&#xff08;TCP&#xff09;与应用层之间 的加密协议&#xff0c;用于在网络通信中实现 机密性、身份认证和数据完整性。 核心目标…