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

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】【8】div布局[子div在父div居底]

    从今天起 开始细话div布局   思路及要点: 父div的位置设置成相对的,即“position: relative;”. 而子div的位置设置成绝对的,并且下边缘设为0,即“position: ab ...

  2. js个人笔记

    一.删除元素 <!DOCTYPE html> <html> <head> <title>删除元素</title> </head> ...

  3. [.Net MVC] 用户角色权限管理_使用CLK.AspNet.Identity

    项目:后台管理平台 意义:一个完整的管理平台需要提供用户注册.登录等功能,以及认证和授权功能. 一.为何使用CLK.AspNet.Identity 首先简要说明所采取的权限控制方式.这里采用了基于角色 ...

  4. 第28条:利用有限制通配符来提升API的灵活性

    参数化类型是不可变的.对两个不同类型T1和T2而言,List<T1>与List<T2>没有父子类型关系. 考虑: public class Stack<E> { p ...

  5. WPF的ScrollViewer鼠标的滚动

    在C# 中,两个ScrollViewer嵌套在一起或者ScrollViewer里面嵌套一个ListBox.Listview(控件本身有scrollviewer)的时候,我们本想要的效果是鼠标滚动整个S ...

  6. <a>作Form表单提</a>

    1. Form表单<%using (Html.BeginForm("AddRoles", "RoleManage", FormMethod.Post, n ...

  7. sscanf用法简析

    1. 常见用法. char buf[512] = ; sscanf("123456 ", "%s", buf); printf("%s\n" ...

  8. 2016041601 - maven用途

    以前只是使用maven只是当成jar依赖管理工具,并没有想到它有多么厉害的功能.现在看书系统学习maven才发现它的强大之处.个人认为通过博客去学习掌握一门技术,这是很低层次的学习方法.学习金字塔,学 ...

  9. 一个优秀php程序员应具备什么样的能力

    1:php能力 1.1 熟悉 一种或者几种框架,并可以用于开发 1.2 了解 这些框架中的优点与缺点 1.3 假如要你选择框架,你会使用哪种最适合你开发 2:数据库能力 2.1:能写一些简单的sql语 ...

  10. unity3d游戏开发——新手引导

    GUI实现,如下: 按“G”键开始新手引导 代码如下: using UnityEngine; using System.Collections; public class OkButton : GUI ...