Doris数据库FE——全局事务状态机

news2024/9/25 3:27:05
begin;
create database db1;
ERROR 1105 (HY000): TException, msg: org.apache.thrift.TException: This is in a transaction, only insert, commit, rollback is acceptable

从上述报错可以看出begin、commit、rollback等操作只有和insert操作结合使用。从上述可以猜测Doris数据库的事务性仅限于此。如下为全局事务支持的相关插入数据的操作。

FRONTEND old dppload, mini load, insert stmt(not straming type)
BACKEND_STRAMING streaming load
INSERT_STREAMING insert stmt (streaming type), update stmt
ROUTINE_LOAD_TASK routine load task
BATCH_LOAD_JOB load job v2 for broker load

全局事务状态机

fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java Env构造函数中有如下代码: this.globalTransactionMgr = new GlobalTransactionMgr(this)。Transaction Manager类主要响应如下三种事务操作:1. begin 2. commit 3.abort 。从如下成员可以看出,GlobalTransactionMgr针对系统中的每个数据库有其对应的DatabaseTransactionMgr,实现针对不同数据库进行分散事务管理。而TransactionIdGenerator就是其事务号发生器,属于中心化全局序发生器的统一时钟类型。该类提供了如下事务操作API。
在这里插入图片描述
beginTransaction 最终还是调用对应数据库的DatabaseTransactionMgr的beginTransaction函数。其调用方无不外乎如下几类:通过thirft协议服务端对外(BE)提供的开启事务的API;NativeInsertStmt语句执行时需要开启事务;DeleteJob执行时需要开启事务。BrokerLoadJob、SparkLoadJob、RoutineLoadTask、CanalSyncChannel任务执行时需要开启事务;对新版优化器Nereids提供的wrappered事务开启接口;StmtExecutor类的beginTxn成员函数,由函数executeForTxn在first time begin txn时调用【handleInsertStmt->executeForTxn->beginTxn】。
在这里插入图片描述
在这里插入图片描述

public class FrontendServiceImpl --> loadTxnBeginImpl --> Env.getCurrentGlobalTransactionMgr().beginTransaction(

                                 --> beginTxnImpl --> Env.getCurrentGlobalTransactionMgr().beginTransaction(

public class NativeInsertStmt extends InsertStmt --> public void analyze(Analyzer analyzer) --> transactionId = Env.getCurrentGlobalTransactionMgr().beginTransaction(

public class DeleteHandler implements Writable --> process --> transactionId = Env.getCurrentGlobalTransactionMgr().beginTransaction

public class BrokerLoadJob extends BulkLoadJob --> beginTxn --> transactionId = Env.getCurrentGlobalTransactionMgr().beginTransaction

public class SparkLoadJob extends BulkLoadJob --> beginTxn --> transactionId = Env.getCurrentGlobalTransactionMgr().beginTransaction

public abstract class RoutineLoadTaskInfo --> beginTxn --> transactionId = Env.getCurrentGlobalTransactionMgr().beginTransaction

public class CanalSyncChannel extends SyncChannel  --> beginTxn --> txnId = Env.getCurrentGlobalTransactionMgr().beginTransaction

public class Transaction [transaction wrapper for Nereids] --> Transaction --> Env.getCurrentGlobalTransactionMgr().beginTransaction

public calss StmtExecutor --> beginTxn --> txnId = Env.getCurrentGlobalTransactionMgr().beginTransaction

commitTransaction 最终还是调用对应数据库的DatabaseTransactionMgr的commitTransaction函数。主要提供给BrokerLoadJob和SparkLoadJob进行事务的提交操作。
在这里插入图片描述

  public class BrokerLoadJob extends BulkLoadJob --> createLoadingTask --> Env.getCurrentGlobalTransactionMgr().commitTransaction

  public class SparkLoadJob extends BulkLoadJob --> tryCommitJob --> Env.getCurrentGlobalTransactionMgr().commitTransaction

abortTransaction 最终还是调用对应数据库的DatabaseTransactionMgr的abortTransaction函数。和beginTransaction类似的调用栈流程,这里就不具体分析了。
在这里插入图片描述

  public class InsertIntoTableCommand --> run --> Env.getCurrentGlobalTransactionMgr().abortTransaction

  public class DeleteHandler implements Writable --> cancelJob --> globalTransactionMgr.abortTransaction

  public abstract class LoadJob extends --> unprotectedExecuteCancel -->Env.getCurrentGlobalTransactionMgr().abortTransaction

  public class CancelLoadAction extends RestBaseController --> execute --> Env.getCurrentGlobalTransactionMgr().abortTransaction

  public class Transaction [transaction wrapper for Nereids] --> executeInsertIntoTableCommand --> Env.getCurrentGlobalTransactionMgr().abortTransaction

  public calss StmtExecutor --> executeByLegacy --> Env.getCurrentGlobalTransactionMgr().abortTransaction

  public class FrontendServiceImpl  --> loadTxnRollbackImpl --> Env.getCurrentGlobalTransactionMgr().abortTransaction

                                    --> rollbackTxnImpl --> Env.getCurrentGlobalTransactionMgr().abortTransaction

commitAndPublishTransaction 其和上述流程不同,首先需要先调用commitTransaction函数,然后需要调用dbTransactionMgr的waitForTransactionFinished等待数据可见,也就是Publish完成。
在这里插入图片描述

  public class DeleteHandler implements Writable  --> unprotectedCommitJob --> globalTransactionMgr.commitAndPublishTransaction

  public class Transaction [transaction wrapper for Nereids] --> executeInsertIntoTableCommand --> globalTransactionMgr.commitAndPublishTransaction

  public calss StmtExecutor --> handleInsertStmt --> Env.getCurrentGlobalTransactionMgr().commitAndPublishTransaction

  public class FrontendServiceImpl  --> loadTxnCommitImpl --> Env.getCurrentGlobalTransactionMgr().commitAndPublishTransaction

                                                      --> commitTxnImpl --> Env.getCurrentGlobalTransactionMgr().commitAndPublishTransaction

preCommitTransaction2PC 最终还是调用对应数据库的DatabaseTransactionMgr的preCommitTransaction2PC函数。该函数只用于thirft接口对外提供。
在这里插入图片描述

public class FrontendServiceImpl  --> loadTxnPreCommitImpl --> Env.getCurrentGlobalTransactionMgr().preCommitTransaction2PC

commitTransaction2PC 最终还是调用对应数据库的DatabaseTransactionMgr的CommitTransaction2PC函数。该函数只用于thirft接口对外提供。
在这里插入图片描述

public class FrontendServiceImpl --> loadTxn2PCImpl --> Env.getCurrentGlobalTransactionMgr().commitTransaction2PC

abortTransaction2PC 最终还是调用对应数据库的DatabaseTransactionMgr的abortTransaction2PC函数。该函数只用于thirft接口对外提供。
在这里插入图片描述

public class FrontendServiceImpl --> loadTxn2PCImpl --> Env.getCurrentGlobalTransactionMgr().abortTransaction2PC

fe/fe-core/src/main/java/org/apache/doris/transaction/PushlishVersionDaemon.java publishVersion() --> finishTransaction

FrontendServiceImpl Txn Op

在这里插入图片描述

FE TXN Service

FE作为服务端,如上代码分析所示,下述thirft接口包含了GlobalTransactionMgr提供的事务API操作。
public TLoadTxnBeginResult loadTxnBegin(TLoadTxnBeginRequest request) throws TException
public TBeginTxnResult beginTxn(TBeginTxnRequest request) throws TException
针对loadTxnBegin接口,主要是由FE自己调用,从下面的代码可以看出如果本FE是master者使用GlobalTransactionMgr提供的beginTransaction函数;否则需要通过MasterTxnExecutor类向真正的master FE转发beginTxn请求。其还有一处由BE进行调用,将在下节分析。
在这里插入图片描述
在这里插入图片描述
public TLoadTxnCommitResult loadTxnPreCommit(TLoadTxnCommitRequest request) throws TException
public TLoadTxnCommitResult loadTxnCommit(TLoadTxnCommitRequest request) throws TException
public TLoadTxn2PCResult loadTxn2PC(TLoadTxn2PCRequest request) throws TException
public TLoadTxnRollbackResult loadTxnRollback(TLoadTxnRollbackRequest request) throws TException

public TCommitTxnResult commitTxn(TCommitTxnRequest request) throws TException
public TRollbackTxnResult rollbackTxn(TRollbackTxnRequest request) throws TException
public TWaitingTxnStatusResult waitingTxnStatus(TWaitingTxnStatusRequest request) throws TException
waitingTxnStatus接口其实就是调用GlobalTransactionMgr类的public TWaitingTxnStatusResult getWaitingTxnStatus(TWaitingTxnStatusRequest request)。和loadTxnBegin类似,如果本FE就是Master就使用GlobalTransactionMgr类的getWaitingTxnStatus,否则使用MasterTxnExecutor类向FE Master进行对应接口请求。
在这里插入图片描述

BE TXN Client

BE作为客户端通过thrift协议向FE发送TXN请求。ClientConnection类用于A scoped client connection to help manage clients from a client cache,也就是各种类型的client的一层封装,用于协助client cache对client进行管理,而FrontendServiceClient才是真正用于向FE server发送请求的客户端。
在这里插入图片描述
针对FE提供的loadTxnBegin接口,BE由StreamLoadExecutor的begin_txn函数进行执行。由stream load的工作原理决定,coordicate be需要向FE提交begin txn请求。
在这里插入图片描述
public TLoadTxnCommitResult loadTxnPreCommit(TLoadTxnCommitRequest request) throws TException
public TLoadTxnCommitResult loadTxnCommit(TLoadTxnCommitRequest request) throws TException
loadTxnPreCommit和loadTxnCommit共用一个请求体,也都是由stream_load_executor类提供的相应函数请求。
在这里插入图片描述在这里插入图片描述
public TLoadTxn2PCResult loadTxn2PC(TLoadTxn2PCRequest request) throws TException接口同样也是由stream_load_executor类的operate_txn_2pc函数请求。
在这里插入图片描述
public TLoadTxnRollbackResult loadTxnRollback(TLoadTxnRollbackRequest request) throws TException 接口同样也是由stream_load_executor类的rollback_txn函数请求。
在这里插入图片描述

TxnManager

be/src/olap/txn_manager.h中的TxnManager类用于txn manager is used to manage mapping between tablet and txns。

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

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

相关文章

【腾学汇的第1个实验代码】应用Matplotlib绘制图标分析

import matplotlib.pyplot as plt import numpy as np #Jupter Notebook 里面显示图片 %matplotlib inline#1.1.1 线形图 np.random.seed(42) #产生随机种子 y np.random.randn(30) #产生随机数 plt.plot(y, "r--o")#绘图:红色--虚线--圆形# 1.1.2 线条颜…

【【哈希应用】位图/布隆过滤器】

位图/布隆过滤器 位图位图概念位图的使用位图模拟实现 布隆过滤器布隆过滤器概念布隆过滤器的使用布隆过滤器模拟实现 位图/布隆过滤器应用:海量数据处理哈希切分 位图 位图概念 计算机中通常以位bit为数据最小存储单位,只有0、1两种二进制状态&#x…

2D网页游戏开发引擎

2D网页开发引擎是用于创建富有交互性和动画效果的2D网页应用程序的工具。以下是一些常用的2D网页开发引擎以及它们的主要特点,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.Phaser: P…

【ES专题】ElasticSearch快速入门

目录 前言从一个【搜索】说起 阅读对象前置知识笔记正文一、全文检索1.1 什么是【全文检索】1.2 【全文检索】原理1.3 什么是倒排索引 二、ElasticSearch简介2.1 ElasticSearch介绍2.2 ElasticSearch应用场景2.3 数据库横向对比 三、ElasticSearch环境搭建3.1 Windows下安装3.2…

Qlik Sense Enterprise 忘记PostgreSQL密码

在 Windows 上安装 Qlik Sense Enterprise 期间会提供密码。如果您忘记了该密码,则无法找回;但是,可以按照以下步骤重置密码。 如何在 Qlik 中重置忘记的 PostgreSQL 密码... - Qlik Community - 1712725 如果该过程完成后记录了密码错误的…

Java架构师面向对象技术建模

目录 1 导学2 面向对象开发2.1 面向对象需求建模2.2 面向对象的设计原则3 统一建模语言UML4 设计模式想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导学 2 面向对象开发 对象:由数据及其操作所构成的封装体,是系统中用来描述客观事务的个实体,是构成系统的一个基…

yolov5 pt转成nccn_yolov5

一:转换环境准备 python版本为Python 3.8.0,需要安装对应的版本包,torch1.10.0 torchvision0.11.0 torchaudio0.10.0 pip3 install torch1.10.0 torchvision0.11.0 torchaudio0.10.0 -f https://download.pytorch.org/whl/torch_stable.html…

小红书平台用户数据分析与可视化

管理器、网页下载器、网页解析器、输出管理器这四个模块去搭建一个爬虫框架,将爬虫流程统一化,将通用的功能进行抽象,减少重复工作。要求实现的爬虫框架可以进行分布式爬取,解决爬虫的统一调度和统一去重,以及存储问题…

Ceph入门到精通-bluestore IO流程及导入导出

bluestore 直接管理裸设备,实现在用户态下使用linux aio直接对裸设备进行I/O操作 写IO流程: 一个I/O在bluestore里经历了多个线程和队列才最终完成,对于非WAL的写,比如对齐写、写到新的blob里等,I/O先写到块设备上&am…

Mybatis 多对一和一对多查询

文章目录 Mybatis 多对一 and 一对多查询详解数据库需求Mybatis代码注意 Mybatis 多对一 and 一对多查询详解 数据库 员工表 t_emp 部门表 t_dept CREATE TABLE t_emp (emp_id int NOT NULL AUTO_INCREMENT,emp_name varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci…

2023年华为云双11有什么优惠活动?详细攻略来了!

随着双十一的临近,华为云也开启了双11大促,推出了“华为云11.11”活动,那么,2023年华为云双11的优惠活动究竟有哪些呢?本文将为大家详细介绍。 一、华为云双11活动入口 活动地址:点此直达 二、华为云双11…

DSP 开发例程(5): tcp_server

目录 DSP 开发例程(5): tcp_server创建工程源码编辑tcp_echo.chelloWorld.c 调试说明 DSP 开发例程(5): tcp_server 此例程实现在 EVM6678L 开发板上创建 TCP Server进程, 完成计算机与开发板之间的 TCP/IP 通信. 例程源码可从我的 gitee 仓库上克隆或下载. 点击 DSP 开发教程…

JAVA基础(JAVA SE)学习笔记(十)多线程

前言 1. 学习视频: 尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第三阶段:Java高级应用 9.异常处理 10.多线程 11.常用类和基础API 12.集合框架 13.泛型 14…

浅谈js代码的封装方法(2023.10.30)

常见的js代码封装方法 2023.10.30 需求1、js代码封装的优缺点2、js代码封装方式2.1 方式一:function function declarations2.1.1 示例 2.2 方式二:class2.2.1 class declarations2.2.2 Class expressions 2.3 变量函数2.4 变量闭包匿名函数2.5 闭包函数…

TiDB 企业版全新升级,平凯数据库核心特性全解读

作为 TiDB 企业版的全新升级,平凯数据库一经推出便广受媒体及用户关注。 近日,平凯星辰首席科学家丁岩在“平凯数据库全解读”活动中,首次详细介绍了平凯数据库的核心能力。 本文为丁岩演讲实录全文,为方便阅读,已做部…

[激光原理与应用-72]:PLC架构与工作原理

目录 一、PLC简介 1.1 概述 1.2 基本组成 1.3 常见的PLC品牌比较 二、PLC程序执行原理 2.1 PLC有操作系统吗? 2.2 PLC程序执行 2.3 PLC编程语言 2.4 PLC编程过程 三、PLC编程工具 3.1 编程工具 四、PLC与工控机协同 4.1 PLC需要配置工控机吗&#xff1…

构建Web UI自动化测试平台

您好, 如果喜欢我的文章或者想上岸大厂,可以关注公众号「量子前端」,将不定期关注推送前端好文、分享就业资料秘籍,也希望有机会一对一帮助你实现梦想 前言 什么是前端UI自动化测试平台?由于部门的业务域非常广&…

HCIP——MGRE实验

一、实验要求 1.R5为ISP,只能进行IP地址配置;其所有地址均为公有IP地址 2.R1和R5间使用PPP的PAP认证,R5为主认证方; R2与R5之间使用PPP的chap认证,R5为主认证方; R3与R5之间使用HDLC封装。 3.R1/R2/R3…

纪念基于JavaScript 实现的后台桌面 UI 设计

目录 前言 C/S 到 B/S ASP Builder 的诞生 关于 Craneoffice.net 开发环境配置 后台界面的 UI 区域要素 桌面系统的想法和设计 搜索引擎 导航面板 快捷访问 二级导航 小组件及其它 设置桌面壁纸 小时钟 附件小程序 计算器界面设计 日历与任务 系统设置 天气小…

ChineseChess.2023.10.30.02

中国象棋模拟器 接下来不管黑怎么走都是开始杀【卒】 中国象棋残局模拟器ChineseChess.2023.10.30.02_桌游棋牌热门视频