事务是关系型数据库的核心,贯穿整个源代码,先来瞅瞅相关的数据结构,揭开面纱:

server层和innodb引擎层分别对应了不同的数据结构,但相互关联:

  1. server层需要引擎注册事务,以便server层能够引用。
  2. 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事务之数据结构的更多相关文章

  1. sql点滴42—mysql中的数据结构

    原文:sql点滴42-mysql中的数据结构 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小 ...

  2. MySQL事务与锁

    MySQL事务与锁 锁的基本概念 锁是计算机协调多个进程或线程并发访问某一资源的机制. 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISA ...

  3. Python MySQL事务、引擎、索引及第三方库sqlalchemy

    本节内容 1.数据库介绍2.事务3.引擎4.索引5.ORM sqlalchemy 1.数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一 ...

  4. Mysql事务及锁

    一.事务(Transaction)及其ACID属性 事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性:1.原子性(Atomicity):事务是一个原子操作单 ...

  5. 深入理解Mysql索引底层数据结构与算法

    索引是帮助MySQL高效获取数据的排好序的数据结构 索引数据结构对比 二叉树 左边子节点的数据小于父节点数据,右边子节点的数据大于父节点数据. 如果col2是索引,查找索引为89的行元素,那么只需要查 ...

  6. MySQL索引之数据结构及算法原理

    MySQL索引之数据结构及算法原理 MySQL支持多个存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.本文只关注BTre ...

  7. 一文彻底读懂MySQL事务的四大隔离级别

    前言 之前分析一个死锁问题,发现自己对数据库隔离级别理解还不够清楚,所以趁着这几天假期,整理一下MySQL事务的四大隔离级别相关知识,希望对大家有帮助~ 事务 什么是事务? 事务,由一个有限的数据库操 ...

  8. MySQL事务概念与流程和索引控制

    MySQL事务概念与流程和索引控制 视图 1.什么是视图 我们在执行SQL语句其实就是对表进行操作,所得到的其实也是一张表,而我们需要经常对这些表进行操作,拼接什么的都会产生一张虚拟表,我们可以基于该 ...

  9. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

随机推荐

  1. 【html】【20】高级篇--轮播图[聚焦]

    下载: http://sc.chinaz.com/jiaoben/151204445580.htm 效果: html <!doctype html> <html> <he ...

  2. LA 2965 Jurassic Remains (中途相遇法)

    Jurassic Remains Paleontologists in Siberia have recently found a number of fragments of Jurassic pe ...

  3. 九度OJ 1207 质因数的个数

    题目地址:http://ac.jobdu.com/problem.php?pid=1207 题目描述: 求正整数N(N>1)的质因数的个数. 相同的质因数需要重复计算.如120=2*2*2*3* ...

  4. TreeSet集合

    TreeSet集合 TreeSet集合是一个依靠TreeMap实现的有序集合,内部存储元素是自动按照自然排序进行排列,所以如果想要保留存储时的顺序,那么就不建议使用TreeSet. TreeSet继承 ...

  5. vertical-align:middle图片或者按钮垂直居中

    <img>或者button按钮 垂直不对齐,加上vertical-align:middle,就能垂直对齐,常用于水平布局的验证码图片 或者按钮 也适用于 text和button在一起也会不 ...

  6. 网页中"IE限制网页访问脚本或ActiveX控件"的提示问题的解决方法

    以前从来没有注意过"IE限制网页访问脚本或ActiveX控件"的提示问题,对于这个小细节问题,虽然感觉很别扭,但一直没考虑解决方法,今天才发现该问题可以轻松解决,以下做个小小记录. ...

  7. php用户验证代码的简单例子

    发布:sunday01   来源:net     [大 中 小] 分享一个简单的php用户验证代码,适合初学的朋友参考,主要学习$_post传递数据及isset检测变量的方法. php简单用户验证代码 ...

  8. PL/SQL — 函数

    函数通常用于返回特定的数据.其实质是一个有名字的PL/SQL块,作为一个schema对象存储于数据库,可以被反复执行.函数通常被作为一个表达式来调用或存储过程的一个参数,具有返回值.   一.建立函数 ...

  9. Google Code Jam 2014 Qualification 题解

    拿下 ABD, 顺利晋级, 预赛的时候C没有仔细想,推荐C题,一个非常不错的构造题目! A Magic Trick 简单的题目来取得集合的交并 1: #include <iostream> ...

  10. ionic+angulajs

    基于ionic+angulajs的混合开发实现地铁APP 项目源码地址:https://github.com/zhangxy1035/SubwayMap 一.项目简介 在该项目中的地铁app是基于io ...