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

Greenplum的两阶段提交

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

在前面的文章中,我们了解了单机库中的事务一致性实现以及分布式事务中的两阶段提交协议。大多数分布式系统都是采用了两阶段提交塄来保证事务的原子性,Greenplum也是采用了两阶段提交,Greenplum的两阶段提交是基于PostgreSQL的基础上实现的。

PostgreSQL的两阶段提交

虽然PostgreSQL是集中式数据库,但是它实现了对两阶段提交协议的支持。PG主要通过PREPARE TRANSACTION、COMMIT TRANSACTION、ROLLBACK PREPARED命令实现对两阶段提交协议的支持。
PREPARE TRANSACTION对应两阶段中的第一阶段,COMMIT/ROLLBACK PREPARED对应两阶段中的第二阶段。
在这里插入图片描述
注:参与者prepare时,会将日志落盘,释放一些资源,但不会释放申请的锁。在PG中,执行完PREPARE后如果把数据库停掉再启动,会发现pg_locks中会残留prepared的事务,这是因为在执行prepare的时候,PG会把事务的lock信息作为prepare日志记录的一部分记录在日志文件(xlog)中,当数据库启动后会读这个日志文件把锁还原到pg_lock表里面。在Greenplum中如果QE在prepare后发生崩溃,QD会在函数doNotifyingCommitPrepared里面重试,QE恢复prepare事务的逻辑与上述PG的步骤类似。
Greenplum在PG的事务基础上实现的分布式事务,具体实现的功能如下图。
在这里插入图片描述
然后我们看一下Greenplum中分布式事务的信息是怎样在QE和QD之间同步。
在这里插入图片描述
当创建一个新的事务时,需要在TMGXACT分布式事务结构体中包含以下信息:

  • 分布式事务ID
  • 分布式事务管理器启动的时间戳
  • 活跃分布式事务中最小的事务ID
  • session ID

这些分布式事务信息,包括分布式快照信息,再通过这种序列化的方式,序列化到一个查询计划里面,然后用dispatch的方式发送到segment上。Segment作为参与者,把信息进行反序列化,读到自己的内存里面,从而完成一个QD到QE之间的信息共享。以下是PG中两阶段协议的一些主要函数及大概逻辑。
在这里插入图片描述
很多数据库会在标准的两阶段提交协议上做了大量的优化,比如在某些情况下使用一阶段提交。Greenplum也做了相应的优化,比如在QD执行提交前,检查事务是否满足一阶段提交的条件:

  • 有写操作,参与者只有一个
  • 只读事务

如果满足以上其中一个,QD就会调用函数doNotifyingOnePhaseCommit向参与者发送DTX_PROTOCOL_COMMAND_COMMIT_ONEPHASE命令,QE完成提交。

http://www.lryc.cn/news/9740.html

相关文章:

  • 多元回归分析 | CNN-BiLSTM卷积双向长短期记忆神经网络多输入单输出预测(Matlab完整程序)
  • git命令行推送本地分支到远程仓库
  • 在vscode中使用Typescript并运行
  • 【C++提高编程】C++全栈体系(十九)
  • Java版电能表协议解析源码(DL/T645-2007)、Modbus串口虚拟工具、网络串口调试工具分享
  • 2023美赛选题建议 美国大学生数学建模竞赛ABCDEF题
  • 2023,想跳槽的可以再等等
  • Java之滑动窗口详解
  • Webpack(应用一:基本使用,只需六步骤)
  • 【Python小游戏】智商爆棚,推荐一款益智类亲子娱乐首选—某程序员老爸:成语编成填空“游戏”,贪玩女儿1天牢记500词(厉害了我的Python)
  • 使用web3连接Georli测试网络
  • Python uWSGI 的安装配置
  • 033.Solidity入门——20函数的可视范围
  • 智能家居项目(三)之框架设计及框架代码文件工程建立
  • 全网最全的Ansible中常用模块讲解
  • linux程序分析工具
  • Python3,2分钟掌握Doscoart库,你也能成为艺术家。
  • 1225057-68-0,Alkyne PEG4 TAMRA-5,四甲基罗丹明-四聚乙二醇-炔基TAMRA红色荧光染料连接剂
  • Ae:解释素材
  • 无文件攻击
  • JS高级——数据类型
  • 场景案例│数字员工在银行业的典型应用场景,效率及准确率“双高”
  • 2023美国大学生数学建模竞赛选题建议
  • 整合K8s+SpringBoot+gRpc
  • ROS 教程:使用 Moveit C++ 接口进行拾取和放置任务
  • seo细分和切入点
  • PyQt5数据库开发1 4.3 QSqlTableModel 之 Qt项目的创建
  • 【大数据】第三章:详解HDFS(送尚硅谷笔记和源码)
  • 27岁想转行IT,还来得及吗?
  • Web前端CSS清除浮动的5种方法