MySQL事务之数据结构
事务是关系型数据库的核心,贯穿整个源代码,先来瞅瞅相关的数据结构,揭开面纱:
server层和innodb引擎层分别对应了不同的数据结构,但相互关联:
- server层需要引擎注册事务,以便server层能够引用。
- innodb层需要维持事务的状态,以及事务的状态转换的具体实现。
1. 相关数据结构
下面用一个简略图描述server和innodb的事务交互:

简单描述一下:
server层通过stmt和all链表关联了所有参与事务的引擎。 每一个connection,在innodb引擎分配一个trx结构,维持到会话结束。
无论一个事务有几条语句,有多少参与的table, 一个引擎只注册一次,因为一个session当前只有一个活动事务。server通过注册的引擎,通知引擎完成事务相关的操作。
相关的数据结构:
THD_TRANS
Ha_data
Ha_trx_info
trx_sys_struct
trx_struct
具体可以参考源码。
2. 事务如何开始
测试: select * from t
t表的引擎是innodb
1. 首次连接
第一次连接,创建THD对象时,初始ha_data[MAX_HA]数组,但并为完成引擎的初始化。
thd->transaction.stmt/all都为空。
2. 创建trx: 对应于每一个连接,表示连接的事务上下文
当语句执行的时候,创建innodb的trx结构,对应ha_data[8].ha_ptr.
函数调用栈:
ha_innobase::store_lock
check_trx_exists
innobase_trx_allocate
trx_allocate_for_mysql:
1. trx_create: 创建trx结构
2. 递增trx_n_mysql_transactions全局计数
3. 加入全局链表trx_sys->mysql_trx_list
innobase_trx_init
初始化 trx跟当前server 层thd关联
注:执行语句的过程中,轮询语句的所有table,在get_table_lock的过程分配trx,因为事务和锁是相关的。所有事务相关的注册等都和table_lock的过程紧密在一起。
3. 注册参与事务的引擎到thd->transaction
ha_info->is_started()如果ha_info已经和引擎关联,那么说明这个事务已经开始,注册过了。
这里要分两种情况:
1. 如果autocommit=0
innodb引擎需要注册stmt,all两个链表
2. 如果autocommit=1
innodb引擎只需要注册stmt链表即可
注册后的结果是:
(gdb) p thd->transaction.all.ha_list.m_ht.db_type
$66 = DB_TYPE_INNODB
4. 事务提交
如果autocommit=0 ,在事务提交时:
释放锁:
ha_innobase::external_lock
trx->n_mysql_tables_in_use--; 释放table lock的过程中,清理trx结构
提交:
trans_commit_stmt
if(thd->transaction.stmt.ha_list)
ha_commit_trans(thd, FALSE);
thd->transaction.stmt.reset(); 重置stmt链表
commit_one_phase_low; 重置ha_trx_info为没有使用状态。
这里仅仅是事务的开始,未完待续......
MySQL事务之数据结构的更多相关文章
- sql点滴42—mysql中的数据结构
原文:sql点滴42-mysql中的数据结构 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小 ...
- MySQL事务与锁
MySQL事务与锁 锁的基本概念 锁是计算机协调多个进程或线程并发访问某一资源的机制. 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISA ...
- Python MySQL事务、引擎、索引及第三方库sqlalchemy
本节内容 1.数据库介绍2.事务3.引擎4.索引5.ORM sqlalchemy 1.数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一 ...
- Mysql事务及锁
一.事务(Transaction)及其ACID属性 事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性:1.原子性(Atomicity):事务是一个原子操作单 ...
- 深入理解Mysql索引底层数据结构与算法
索引是帮助MySQL高效获取数据的排好序的数据结构 索引数据结构对比 二叉树 左边子节点的数据小于父节点数据,右边子节点的数据大于父节点数据. 如果col2是索引,查找索引为89的行元素,那么只需要查 ...
- MySQL索引之数据结构及算法原理
MySQL索引之数据结构及算法原理 MySQL支持多个存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.本文只关注BTre ...
- 一文彻底读懂MySQL事务的四大隔离级别
前言 之前分析一个死锁问题,发现自己对数据库隔离级别理解还不够清楚,所以趁着这几天假期,整理一下MySQL事务的四大隔离级别相关知识,希望对大家有帮助~ 事务 什么是事务? 事务,由一个有限的数据库操 ...
- MySQL事务概念与流程和索引控制
MySQL事务概念与流程和索引控制 视图 1.什么是视图 我们在执行SQL语句其实就是对表进行操作,所得到的其实也是一张表,而我们需要经常对这些表进行操作,拼接什么的都会产生一张虚拟表,我们可以基于该 ...
- Mysql事务探索及其在Django中的实践(二)
继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...
随机推荐
- (转)QRCODE二维码介绍及常用控件推荐
什么是QR Code码? QR Code码是由日本Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大.可靠性高.可表示汉字及图象多种文字信息.保密防 ...
- 移动前端开发之viewport的深入理解(转载)
本文为转载文章,原文网址:http://www.cnblogs.com/2050/p/3877280.html 在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport了,只有 ...
- NodeJS连接MongoDB数据库时报错
今天第一次尝试连接MongoDB数据库,具体步骤也很简单. 首先,通过NodeJS运行环境安装MongoDB包,进入要安装的目录,执行语句 npm install mongodb 安装成功后,通过如下 ...
- DLL详解及Denpendcy Walker的使用
下面的文章被N次转载,为了尊重原作,\(^o^)/~,贴出最早发布这篇文章的地址及作者. 动态链接库 Windows的活动大陆 2006-07-26 09:21 作者:狂ρκ来源:电脑爱好者 在 ...
- makefile-0711-168 SEVERE ERROR: Input file:
ld: 0711-168 SEVERE ERROR: Input file: /cicm/commlib/include Input files must be regular file ...
- 《APUE》第四章笔记(2)
下面介绍对stat结构的各个成员的操作函数. 先贴个stat结构的图: access函数: #include <unistd.h> int access(const char *pathn ...
- JDBC-ODBC桥接访问SQLServer2008数据库
来源:十二随风博客 将对JDBC API的调用,转换为对另一组数据库连接API的调用优点:可以访问所有ODBC可以访问的数据库缺点:执行效率低.功能不够强大 (1)建立数据源,注意系统DNS才行,用户 ...
- AJAX安全-Session做Token
个人思路,请大神看到了指点 个人理解token是防止扫号机或者恶意注册.恶意发表灌水,有些JS写的token算法,也会被抓出来被利用,个人感觉还是用会过期的Session做token更好,服务器存储, ...
- struct timespec 和 struct timeval
time()提供了秒级的精确度 . 1.头文件 <time.h> 2.函数原型 time_t time(time_t * timer) 函数返回从TC1970-1-1 0:0:0开始到现在 ...
- 可以自动安装mysql数据库的一个shell脚本
发布:thatboy 来源:脚本学堂 [大 中 小] 分享一例shell脚本,可以实现mysql数据库的自动安装,脚本写的不错,无论是用来学习,还是生产环境中应用,都是不错的,有需要的朋友 ...