OpenGauss数据库中事务管理源码解析

一、事务

  1. 事务的定义

事务是数据库操作的执行单位,需要满足最基本的ACID(原子性、一致性、隔离性、持久性)属性。

1 原子性:一个事务提交之后要么全部执行,要么全部不执行。

2 一致性:事务的执行不能破坏数据库的完整性和一致性。

3 隔离性:事务的隔离性是指在并发中,一个事务的执行不能被其他事务干扰。

4 持久性:一旦事务完成提交,那么它对数据库的状态变更就会永久保存在数据库中。

本章主要介绍openGauss事务模块是如何实现数据库事务的基本属性,使用户数据不丢不错、修改不乱、查询无错误。

   2.事务管理器

事务管理器:事务系统的中枢,它的实现是一个有限循环状态机,通过接受外部系统的命令并根据当前事务所处的状态决定事务的下一步执行过程。

openGauss中,事务的实现与存储引擎的实现有很强关联,代码主要集中在src/gausskernel/storage/access/transamsrc/gausskernel/storage/lmgr下。

1 事务管理器:事务系统的中枢,它的实现是一个有限循环状态机,通过接受外部系统的命令并根据当前事务所处的状态决定事务的下一步执行过程。

2 日志管理器:用来记录事务执行的状态以及数据变化的过程,包括事务提交日志(CLOG)、事务提交序列日志(CSNLOG)以及事务日志(XLOG)。其中CLOG日志只用来记录事务执行的结果状态,CSNLOG记录日志提交的顺序,用于可见性判断;XLOG是数据的redo日志,用于恢复及持久化。

3 线程管理机制:通过一片内存区域记录所有线程的事务信息,任何一个线程可以通过访问该区域获取其他事务的状态信息。

4 MVCC机制:openGauss系统中,事务执行读流程结合各事务提交的CSN序列号,采用了多版本并发控制机制,实现了元组的读和写互不阻塞。详细可见性判断方法见“5.2 事务并发控制

5 锁管理器:实现系统的写并发控制,通过锁机制来保证事务写流程的隔离性。

二、Opengauss中的事务

   1.层次

openGauss将事务系统分为上层(事务块TBlockState)以及底层(TransState)两个层次。

通过分层的设计,在处理上层业务时可以屏蔽具体细节,实现灵活支持客户端各类事务执行语句(BEGIN/START TRANSACTION/COMMIT/ROLLBACK/END)。

1 事务块TBlockState:客户端query的状态,用于提高用户操作数据的灵活性,用事务块的形式支持在一个事务中执行多条query语句。

2 底层事务TransState:内核端视角,记录了整个事务当前处于的具体状态。

   2. 具体代码

事务块上层状态机结构体代码如下:

底层事务块代码:

    3.事务状态转换相关函数

        

改变事务块上层的状态

处理函数,根据相应的状态机调用子函数,在每个query处理前后,或检测到错误后被postgres.c 调用

根据当前事务上层状态机,对事务的资源进行相应的申请、回收及清理

事务处理子函数

子函数

说明

StartTransaction

开启事务,对内存及变量进行初始化操作,完成后将底层事务状

态置为TRANS_INPROGRESS

CommitTransaction

当前的底层状态机为TRANS_INPROGRESS,然后置为TRANS_COMMIT

最后将底层状态机置为TRANS_DEFAULT

AbortTransaction

释放LWLockUnlockBuffersLockErrorCleanup,当前底层状态为

TRANS_INPROGRESS,设置为TRANS_ABORT,记录相应的CLOG日志,

清空事务槽位信息,释放各类资源

CleanupTransaction

当前底层状态机应为TRANS_ABORT,继续清理一些资源,一般紧接

着AbortTransaction调用

StartSubTransaction

开启子事务

CommitSubTransaction

提交子事务

AbortSubTransaction

回滚子事务

CleanupSubTransaction

清理子事务的一些资源信息,类似于CleanupTransaction

事务执行函数

函数

说明

StartTransactionCommand

事务开始时根据上层状态机调用相应的事务执行函数

CommitTransactionCommand

事务结束时根据上层状态机调用相应的事务执行函数

AbortCurrentTransaction

事务内部出错,长跳转longjump调用,提前清理掉相应的资源,

并将事务上层状态机置为TBLOCK_ABORT

上层事务状态机控制函数

函数

说明

BeginTransactionBlock

开启一个显式事务时,将上层事务状态机变为TBLOCK_BEGIN

EndTransactionBlock

显式提交一个事务时,将上层事务状态机变为TBLOCK_END

UserAbortTransactionBlock

显式回滚一个事务时,将上层事务状态机变为TBLOCK_ABORT_PENDING/

TBLOCK_ABORT_END

你可能感兴趣的:(数据库,database,sql)