海山数据库(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的研发。