海山数据库(He3DB)源码详解:事务源码执行过程
本文介绍了He3DB数据库在DDL和DML操作过程中,两种事务在底层源码执行流程细节。
操作过程
1、启动数据库并进入GDB
- 首先,在终端A启动一个测试用的数据库test,并查看当前测试用的test数据库后台线程;
- 然后,在终端B利用
ps指令查看后台进程,并利用gdb调试数据库对应线程。
注意:这里是两个终端,一个执行数据库,一个执行GDB

2、打断点并查询数据库
- 在GDB中对事务操作函数和查询函数打断点,函数分别为:
- b StartTransactionCommand
- b StartTransaction
- b PortalRunSelect
- b CommitTransactionCommand
- b CommitTransaction
- 在数据库中执行SELECT语句;

3、事务开始
执行查询语句后,在GDB中查看源码,可以发现SELECT命令首先会执行StartTransactionCommand函数,并在switch-case结构中,根据事务块状态(s->blockState)选择要执行的下一步。

4、开始事务执行
根据当前事务块状态s->blockState = TBLOCK_DEFAULT,跳转执行StartTransaction函数。在StartTransaction函数会具体执行事务开始的相关操作,并先将事务状态从s->state = TRANS_DEFAULT改为s->state = TRANS_START,完成事务开始操作之后将事务设置为s->state = TRANS_INPROGRESS,退出返回StartTransactionCommand函数,并将事务块状态改为s->blockState = TBLOCK_START。

5、执行事务查询
完成事务开始操作后,跳转到PortalRunSelect函数执行事务查询函数,并通过执行PushActiveSnapshot、ExecutorRun和PopActiveSnapshot三个函数进行具体的事务查询操作。

6、事务提交
完成事务查询后,跳转到CommitTransactionCommand函数,并在switch-case结构中,根据事务块状态(s->blockState)选择要执行的下一步。

7、执行事务提交
根据当前事务块状态s->blockState = TBLOCK_START,执行CommitTransaction函数执行具体的事务提交操作。执行过程中,先将事务状态从s->state = TRANS_INPROGRESS改为s->state = TRANS_COMMIT,并在完成事务提交之后将事务状态重置为s->state = TRANS_DEFAULT。
总结
可以看出,一个DDL或DML语句的完成执行过程,在源码底层中:
首先,要通过事务块操作函数判断事务块状态,来选择具体要执行的事务行为;
之后,通过对应的事务操作函数执行事务过程,包括事务开始StartTransaction、事务提交CommitTransaction、事务放弃AbortTransaction和事务清理CleanupTransaction。
作者介绍
李超,移动云数据库工程师,负责云原生数据库He3DB的研发。















![[240822] X-CMD 发布 v0.4.7: 新增 htop 、btop 和 ncdu 模块;优化 colr 和 scoop 模块](https://i-blog.csdnimg.cn/direct/4ce6e4234eca4b76b2b522963fb94d1d.png#pic_center)


